2012-05-05 9 views
5

की बजाय ब्लैक स्क्रीन मैंने अलग-अलग बनावट की जांच की है, वे ठीक काम करते हैं। प्रत्येक बनावट 128 * 128 पिक्सल है, मैं मोटोरोला मिलिस्टन मोबाइल, पर काम कर रहा हूं और सभी मूल उदाहरणों (लाइन से क्यूबमैप तक) का परीक्षण किया है, जबकि आयताकार multitexturing जबकि अटक गया है।बहु-पाठण

शेडर अच्छी तरह से काम करता है अगर मैं किसी भी बनावट को बांध नहीं पाता हूं, लेकिन समस्या multitexturing के लिए दो बनावट के साथ शुरू होती है।

private float[] myRotateMatrix = new float[16]; 
private float[] myViewMatrix = new float[16]; 
private float[] myProjectionMatrix = new float[16]; 
private float[] myMVPMatrix = new float[16]; 
private int aPositionLocation; 
private int uMVPLocation; 
private int aTextureCoordLocation; 
private FloatBuffer rectangleVFB; 
private ShortBuffer rectangleISB; 
private FloatBuffer textureCFB; 
private int program; 
private int textureId1; 
private int textureId2; 
private int uSampler1Location; 
private int uSampler2Location; 

private void initShapes() { 
    float[] rectangleVFA = {-1,-1,0, 1,-1,0, 1,1,0, -1,1,0}; 
    short[] rectangleISA = {0,1,2, 0,3,2}; 
    float[] textureCFA = {0,0, 1,0, 1,1, 0,1}; 

    ByteBuffer rectangleVBB = ByteBuffer.allocateDirect(rectangleVFA.length * 4); 
    rectangleVBB.order(ByteOrder.nativeOrder()); 
    rectangleVFB = rectangleVBB.asFloatBuffer(); 
    rectangleVFB.put(rectangleVFA); 
    rectangleVFB.position(0); 

    ByteBuffer rectangleIBB = ByteBuffer.allocateDirect(rectangleISA.length * 2); 
    rectangleIBB.order(ByteOrder.nativeOrder()); 
    rectangleISB = rectangleIBB.asShortBuffer(); 
    rectangleISB.put(rectangleISA); 
    rectangleISB.position(0); 

    ByteBuffer textureCBB = ByteBuffer.allocateDirect(textureCFA.length * 4); 
    textureCBB.order(ByteOrder.nativeOrder()); 
    textureCFB = textureCBB.asFloatBuffer(); 
    textureCFB.put(textureCFA); 
    textureCFB.position(0); 
} 

public void onSurfaceChanged(GL10 gl, int width, int height) { 
    GLES20.glViewport(0, 0, width, height); 
    checkError("glViewport"); 
    float ratio = (float) width/height; 
    Matrix.setLookAtM(myViewMatrix, 0, 0, 0, 6, 0, 0, 0, 0, 1, 0); 
    Matrix.frustumM(myProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 

    aPositionLocation = GLES20.glGetAttribLocation(program, "aPosition"); 
    checkError("glGetAttribLocation"); 

    uMVPLocation = GLES20.glGetUniformLocation(program, "uMVP"); 
    checkError("glGetUniformLocation"); 

    aTextureCoordLocation = GLES20.glGetAttribLocation(program, "aTextureCoord"); 
    checkError("glGetAttribLocation"); 

    uSampler1Location = GLES20.glGetUniformLocation(program, "uSampler1"); 
    checkError("glGetUniformLocation"); 

    uSampler2Location = GLES20.glGetUniformLocation(program, "uSampler2"); 
    checkError("glGetUniformLocation"); 

    int[] textures = new int[2]; 

    GLES20.glGenTextures(2, textures, 0); 
    checkError("glGenTextures"); 

    textureId1 = textures[0]; 
    textureId2 = textures[1]; 

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId1); 
    checkError("glBindTexture"); 

    InputStream is1 = context.getResources().openRawResource(R.drawable.brick1); 
    Bitmap img1; 
    try { 
     img1 = BitmapFactory.decodeStream(is1); 
    }finally { 
     try { 
      is1.close(); 
     }catch (IOException ioe) { 
     } 
    } 
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, img1, 0); 

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId2); 
    checkError("glBindTexture"); 

    InputStream is2 = context.getResources().openRawResource(R.drawable.brick2); 
    Bitmap img2; 
    try { 
     img2 = BitmapFactory.decodeStream(is2); 
    }finally { 
     try { 
      is2.close(); 
     }catch (IOException ioe) { 
     } 
    } 
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, img2, 0); 

    GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 
} 

public void onDrawFrame(GL10 gl) { 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    checkError("glClear"); 

    GLES20.glUseProgram(program); 
    checkError("glUseProgram"); 

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    checkError("glActiveTexture"); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId1); 
    checkError("glBindTexture"); 

    GLES20.glUniform1i(uSampler1Location, 0); 
    checkError("glUniform1i"); 

    GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 
    checkError("glActiveTexture"); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId2); 
    checkError("glBindTexture"); 

    GLES20.glUniform1i(uSampler2Location, 1); 
    checkError("glUniform1i"); 

    Matrix.setIdentityM(myRotateMatrix, 0); 
    Matrix.rotateM(myRotateMatrix, 0, touchX, 0, 1, 0); 
    Matrix.rotateM(myRotateMatrix, 0, touchY, 1, 0, 0); 
    Matrix.multiplyMM(myMVPMatrix, 0, myViewMatrix, 0, myRotateMatrix, 0); 
    Matrix.multiplyMM(myMVPMatrix, 0, myProjectionMatrix, 0, myMVPMatrix, 0); 

    GLES20.glVertexAttribPointer(aPositionLocation, 3, GLES20.GL_FLOAT, false, 12, rectangleVFB); 
    checkError("glVertexAttribPointer"); 

    GLES20.glEnableVertexAttribArray(aPositionLocation); 
    checkError("glEnableVertexAttribArray"); 

    GLES20.glVertexAttribPointer(aTextureCoordLocation, 2, GLES20.GL_FLOAT, false, 8, textureCFB); 
    checkError("glVertexAttribPointer"); 

    GLES20.glEnableVertexAttribArray(aTextureCoordLocation); 
    checkError("glEnableVertexAttribArray"); 

    GLES20.glUniformMatrix4fv(uMVPLocation, 1, false, myMVPMatrix, 0); 
    checkError("glUniformMatrix4fv"); 

    GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, rectangleISB); 
    checkError("glDrawElements"); 
} 
+0

चूंकि वे कोड के टुकड़े काफी उचित लग की आवश्यकता होगी आप कुछ और कोड दिखाएगी, हो सकता है पूरे शेडर्स, और कुछ और प्रारंभिक और प्रतिपादन कोड। और सुनिश्चित करें कि आपके बनावट पूर्ण हैं (यदि उनके पास mipmaps नहीं है तो 'GL_LINEAR' फ़िल्टरिंग का उपयोग करें), लेकिन चूंकि आप कहते हैं कि वे अलग-अलग काम करते हैं, मुझे लगता है कि वे पूर्ण हैं। –

+0

सबसे पहले: आपकी टिप्पणी करना एक खुशी है: डी धन्यवाद टिप्पणी के लिए बहुत सर, और यहां नीचे दिया गया कोड है: – GLES

+2

** [सोल्वड] ** ओपनजीएल ईएस 2.0 में, प्रत्येक कॉल के बाद 'glbindTexture' और 'textxmage2D' से पहले ** पैरामीटर के लिए ** पैरामीटर को अलग-अलग निर्दिष्ट किया जाना चाहिए, इसलिए यदि 2 बनावट हैं (जैसे मल्टीटेक्स्टिंग में) तो इसे 4 'glTexParameterf' की आवश्यकता होगी प्रत्येक बनावट 1 और 2 के लिए, कुल ** 8 * * – GLES

उत्तर

3

ओपन ES 2.0 में, हर कॉल के बाद glBindTexture करने और texImage2D पहले कि बनावट के लिए मानकों अलग से निर्दिष्ट किया जाना है।

तो, अगर वहाँ 2 बनावट कर रहे हैं (multitexturing के रूप में) तो यह 4 glTexParameterf प्रत्येक बनावट 1 और 2 के लिए, कुल 8.