2012-05-05 9 views
5

Ho controllato le trame singolarmente, funzionano bene. Ognuna delle trame è 128 * 128 pixel, sto lavorando su Motorola MILESTONE mobile, e ho testato tutti gli esempi di base (da linea a cubemap), mi sono bloccato mentre rettangolo multitexturing .Schermo nero invece di multi-texturing

Lo shader funziona bene se non lego nessuna delle trame, ma il problema inizia con due trame per il 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

Da quei frammenti di codice sembrano abbastanza ragionevole si dovrebbe mostrare un po 'di codice, forse tutti gli shader e qualche altro codice di inizializzazione e rendering. E assicurati che le tue trame siano complete (usa il filtro 'GL_LINEAR' se non hanno mipmaps), ma dal momento che dici che funzionano individualmente, immagino che siano complete. –

+0

Prima di tutto: è un piacere avere il tuo commento: D grazie mille per aver commentato, ed ecco il codice qui sotto: – GLES

+2

** [SOLVED] ** In OpenGL ES 2.0, dopo ogni chiamata a 'glBindTexture' e prima di 'texImage2D' i ** parametri ** per quella texture devono essere specificati separatamente, quindi se ci sono 2 trame (come in multitexturing) allora richiederà 4' glTexParameterf' ciascuno per le texture 1 e 2, totale ** 8 * * – GLES

risposta

3

In OpenGL ES 2.0, dopo ogni chiamata a glBindTexture e prima texImage2D i parametri per quella struttura devono essere specificati separatamente.

Quindi, se ci sono 2 strutture (come in multitexturing) allora sarà bisogno di 4 glTexParameterf ciascuno per texture 1 e 2, totale 8.

Problemi correlati