1

我似乎无法为我的正方形渲染纹理。我已经让我的程序用颜色渲染空白方块。任何帮助是极大的赞赏。

我已将我的代码重新设计为以下内容,并认为我设置顶点坐标和纹理坐标的方式存在问题。我还在 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");
}
4

2 回答 2

0

你的SetupGLPositionHandle功能对我来说看起来不对。为什么要在函数末尾禁用 PositionHandle 属性?

该属性必须在调用 glDrawArrays 时启用。

于 2012-08-03T23:30:00.397 回答
0

textureHandle上面代码中的主要问题是我texCoordHandlerglVertexAttribPointer //Texture

代码应如下所示:

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

由于出现了这个问题,我再次重写了我的代码。添加索引(draworder),将我的Vertex和Texture数组组合成一个Vertices数组,并且只引用a vertexBuffer//同时包含位置坐标和纹理坐标而不是atextureBuffer和a vertexBuffer//只包含位置坐标

我也将其更改GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);为:

GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, 
                      GLES20.GL_UNSIGNED_SHORT, indexBuffer);
于 2012-08-05T23:26:54.557 回答