Java OpenGL es 2.0 Android纹理
我似乎无法为我的正方形渲染纹理。我已经得到我的程序来渲染空白广场的颜色。非常感谢您的帮助 我已经将代码重新设计为以下内容,并相信如何设置顶点坐标和纹理坐标存在问题。在glDrawArrays函数中,我还得到一个libc致命信号11 以下是顶点和纹理坐标: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;
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;?我已经改变了禁用函数的位置,但是它仍然没有呈现正方形。