Java OpenGL es 2.0 Android纹理

Java OpenGL es 2.0 Android纹理,java,android,opengl-es-2.0,Java,Android,Opengl Es 2.0,我似乎无法为我的正方形渲染纹理。我已经得到我的程序来渲染空白广场的颜色。非常感谢您的帮助 我已经将代码重新设计为以下内容,并相信如何设置顶点坐标和纹理坐标存在问题。在glDrawArrays函数中,我还得到一个libc致命信号11 以下是顶点和纹理坐标: private final FloatBuffer vertexBuffer; private final FloatBuffer textureBuffer; static final int COORDS_PER_VERTEX = 3;

我似乎无法为我的正方形渲染纹理。我已经得到我的程序来渲染空白广场的颜色。非常感谢您的帮助

我已经将代码重新设计为以下内容,并相信如何设置顶点坐标和纹理坐标存在问题。在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,
};
这是我在square类中的绘图函数:

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");
}

您的
SetupGLPositionHandle
函数在我看来是错误的。为什么在函数末尾禁用PositionHandle属性


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

我在上述代码中的主要问题是,我使用的是
textureHandle
而不是
GlvertexAttributePointer//Texture
中的
texCoordHandler

代码应该如下所示:

GLES20.glVertexAttribPointer(texCoordHandler, COORDS_PER_TEXTURE,
                            GLES20.GL_FLOAT, false, 
                            textureStride, textureBuffer);
自从这个问题出现后,我再次重写了我的代码。添加索引(draworder),将我的顶点和纹理数组合并到一个顶点数组中,只引用一个
vertexBuffer
//包含位置坐标和纹理坐标,而不是
textureBuffer
vertexBuffer
//只包含位置坐标

我还更改了
GLES20.gldrawArray(GLES20.GL_三角形,0,vertexCount)至:

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

您能将步幅设置为0并像这样尝试吗。@Nate shader.getProgram()只是您使用GLES20.glCreateProgram()创建的新opengl程序的一个getter;?我已经改变了禁用函数的位置,但是它仍然没有呈现正方形。