2012-08-03 274 views
1

我似乎無法渲染紋理到我的廣場。我已經得到了我的程序來渲染帶有顏色的空白方塊。任何幫助是極大的讚賞。OpenGL es 2.0 Android紋理

我已將我的代碼重新設計爲以下內容,並相信問題存在於我如何設置頂點座標和紋理座標。我也在我的glDrawArrays函數中得到libc致命信號11。

這裏是頂點和紋理座標:

private final FloatBuffer vertexBuffer; 
private final FloatBuffer textureBuffer; 

static final int COORDS_PER_VERTEX = 3; 
static float positionCoords[] = { // in counterclockwise order: 
    -1.0f, 1.0f, 1.0f,    
    -1.0f, -1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 
    -1.0f, -1.0f, 1.0f,     
    1.0f, -1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 
}; 

static final int COORDS_PER_TEXTURE = 2; 
static float textureCoords[] = { 
    0.0f, 0.0f,     
    0.0f, 1.0f, 
    1.0f, 0.0f, 
    0.0f, 1.0f, 
    1.0f, 1.0f, 
    1.0f, 0.0f, 
}; 

這裏是我的平方類別我的繪製函數:

public void draw(float[] mvpMatrix) 
{ 
    int MVPMatrixHandle = GLES20.glGetUniformLocation(shader.getProgram(), "u_MVPMatrix"); 
    int textureHandler = GLES20.glGetUniformLocation(shader.getProgram(), "u_s_texture"); 
    int positionHandler = GLES20.glGetAttribLocation(shader.getProgram(), "a_position"); 
    int texCoordHandler = GLES20.glGetAttribLocation(shader.getProgram(), "a_texCoord"); 

     Log.d(TAG, "Setting up GLProgram Handlers"); 
     GlRenderer.checkGlError("Setup GLProgram Handlers"); 

    GLES20.glEnableVertexAttribArray(positionHandler); 
    GLES20.glEnableVertexAttribArray(texCoordHandler); 

     GlRenderer.checkGlError("EnableVertexAttribArrays"); 

    GLES20.glVertexAttribPointer(positionHandler, COORDS_PER_VERTEX, 
           GLES20.GL_FLOAT, false, 
           vertexStride, vertexBuffer);   

    GLES20.glVertexAttribPointer(textureHandler, COORDS_PER_TEXTURE, 
           GLES20.GL_FLOAT, false, 
           textureStride, textureBuffer); 

     GlRenderer.checkGlError("VertexAttribPointers (Position, Texture)"); 


    GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, mvpMatrix, 0); 

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID); 

    GLES20.glUniform1i(textureHandler, 0); 

     GlRenderer.checkGlError("Binding Texture"); 

    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); 

     GlRenderer.checkGlError("Draw Arrays"); 

    GLES20.glDisableVertexAttribArray(positionHandler); 
    GLES20.glDisableVertexAttribArray(texCoordHandler); 

     GlRenderer.checkGlError("DisableVertexAttribArrays"); 
} 
+0

您可以將您的步幅設置爲0並嘗試如此。 – tolgap 2012-08-03 23:16:07

+0

這不起作用。 – 2012-08-04 01:10:18

+0

@Nate shader.getProgram()只是使用GLES20.glCreateProgram()創建的新的opengl程序的getter();? – 2012-11-21 13:29:02

回答

0

我在上面的代碼主要問題是事實,我在glVertexAttribPointer //Texture

使用textureHandle,而不是texCoordHandler的代碼應該是這樣的:

GLES20.glVertexAttribPointer(texCoordHandler, COORDS_PER_TEXTURE, 
          GLES20.GL_FLOAT, false, 
          textureStride, textureBuffer); 

由於這個問題出現了我我又重寫了我的代碼。加算指標(DRAWORDER),我的頂點和紋理陣列組合成一個頂點數組,而只是引用vertexBuffer //同時包含位置座標和紋理座標一個textureBuffer,而不是和vertexBuffer //只包含位置座標

我ve也將GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);更改爲:

GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, 
         GLES20.GL_UNSIGNED_SHORT, indexBuffer); 
0

SetupGLPositionHandle功能看起來我錯了。爲什麼在函數的結尾處禁用PositionHandle屬性?

該屬性必須在調用glDrawArrays時啓用。

+0

我已經改變了禁用功能的位置,但它仍然沒有渲染廣場謝謝。 – 2012-08-04 00:14:13