2012-05-05 13 views
5

He revisado las texturas de forma individual, funcionan bien. Cada una de las texturas tiene 128 * 128 píxeles, estoy trabajando en el móvil Motorola MILESTONE, y he probado todos los ejemplos básicos (de la línea al mapa del cubo), me he atascado al multitexturar el rectángulo .Pantalla negra en lugar de texturizado múltiple

El sombreador funciona bien si no enlazo ninguna de las texturas, pero el problema comienza con dos texturas para la multitextura.

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

Desde aquellos fragmentos de código se ven bastante razonable que debe mostrar algo más de código, tal vez todos los sombreadores y algunos más códigos de inicialización y renderización. Y asegúrate de que tus texturas estén completas (usa el filtrado 'GL_LINEAR' si no tienen mipmaps), pero como dices que funcionan individualmente, creo que están completas. –

+0

Antes que nada: es un placer tener su comentario: D muchas gracias Señor por comentar, y aquí está el código a continuación: – GLES

+2

** [SOLUCIONADO] ** En OpenGL ES 2.0, después de cada llamada a 'glBindTexture' y antes de 'texImage2D' los ** parámetros ** para esa textura deben especificarse por separado, por lo que si hay 2 texturas (como en multitextura) entonces requerirá 4' glTexParameterf' cada uno para textura 1 y 2, total ** 8 * * – GLES

Respuesta

3

En OpenGL ES 2.0, después de cada llamada a glBindTexture y antes texImage2D los parámetros para que la textura tiene que ser especificado por separado.

lo tanto, si hay 2 texturas (como en multitexturas) entonces se requiere 4 glTexParameterf cada uno para la textura 1 y 2, el total de 8.

Cuestiones relacionadas