2012-05-05 37 views
5

Tôi đã kiểm tra riêng từng kết cấu, chúng hoạt động tốt. Mỗi hoạ tiết là 128 * 128 pixel, tôi đang làm việc trên điện thoại di động Motorola MILESTONE, và đã thử nghiệm tất cả các ví dụ cơ bản (từ đường tới cubemap), bị kẹt trong khi hình chữ nhật đa chiều.Màn hình đen thay vì đa hoạ tiết

Trình đổ bóng hoạt động tốt nếu tôi không ràng buộc bất kỳ kết cấu nào, nhưng vấn đề bắt đầu bằng hai kết cấu để đa xử lý.

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

Kể từ khi những đoạn mã trông khá hợp lý bạn sẽ hiển thị một số mã khác, có lẽ toàn bộ trình đổ bóng và một số mã khởi tạo và hiển thị khác. Và chắc chắn rằng kết cấu của bạn đã hoàn thành (sử dụng 'GL_LINEAR' lọc nếu chúng không có mipmap), nhưng vì bạn nói chúng hoạt động riêng lẻ, tôi đoán chúng đã hoàn thành. –

+0

Trước hết: đó là một niềm vui để có bình luận của bạn: D cảm ơn rất nhiều Sir cho ý kiến, và đây là đoạn code dưới đây: – GLES

+2

** [SOLVED] ** Trong OpenGL ES 2.0, sau mỗi cuộc gọi đến 'glBindTexture' và trước 'texImage2D' các tham số ** ** cho kết cấu đó phải được chỉ định riêng biệt, vì vậy nếu có 2 kết cấu (như trong multitexturing) thì nó sẽ yêu cầu 4' glTexParameterf' cho mỗi texture 1 và 2, tổng ** 8 * * – GLES

Trả lời

3

Trong OpenGL ES 2.0, sau mỗi cuộc gọi đến glBindTexture và trước texImage2D các tham số cho kết cấu đó phải được xác định riêng rẽ.

Vì vậy, nếu có 2 textures (như trong multitexturing) sau đó nó sẽ yêu cầu 4 glTexParameterf từng cho kết cấu 1 và 2, tổng 8.

Các vấn đề liên quan