OpenGL ES 2.0的Android的纹理 [英] OpenGL es 2.0 Android Texture
问题描述
我似乎无法渲染贴图我的广场。我已经得到了我的计划,渲染色彩的空白方块。任何帮助是极大的AP preciated。
我已经重新设计了我code以下,相信与我如何建立我的顶点坐标和纹理坐标存在的问题。我也在我的调用glDrawArrays函数得到一个致命的libc信号11。
下面是顶点和纹理坐标:
私人最终FloatBuffer vertexBuffer;
私人最终FloatBuffer textureBuffer;静态最终诠释COORDS_PER_VERTEX = 3;
静浮positionCoords [] = {//逆时针顺序:
-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,
};静态最终诠释COORDS_PER_TEXTURE = 2;
静浮textureCoords [] = {
0.0,0.0,
0.0,1.0F,
1.0F,0.0,
0.0,1.0F,
1.0F,1.0F,
1.0F,0.0,
};
下面是我的绘制函数在我的方形类:
公共无效平局(浮动[] 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,设置GLProgram处理程序);
GlRenderer.checkGlError(设置GLProgram处理程序); GLES20.glEnableVertexAttribArray(positionHandler);
GLES20.glEnableVertexAttribArray(texCoordHandler); GlRenderer.checkGlError(EnableVertexAttribArrays); GLES20.glVertexAttribPointer(positionHandler,COORDS_PER_VERTEX,
GLES20.GL_FLOAT,假的,
vertexStride,vertexBuffer); GLES20.glVertexAttribPointer(textureHandler,COORDS_PER_TEXTURE,
GLES20.GL_FLOAT,假的,
textureStride,textureBuffer); GlRenderer.checkGlError(VertexAttribPointers(位置,纹理));
GLES20.glUniformMatrix4fv(MVPMatrixHandle,1,假,mvpMatrix,0); GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textureID); GLES20.glUniform1i(textureHandler,0); GlRenderer.checkGlError(绑定纹理); GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,vertexCount); GlRenderer.checkGlError(画阵列); GLES20.glDisableVertexAttribArray(positionHandler);
GLES20.glDisableVertexAttribArray(texCoordHandler); GlRenderer.checkGlError(DisableVertexAttribArrays);
}
我在上面code的主要问题是,我用的是 textureHandle
而不是事实的 texCoordHandler
在 glVertexAttribPointer //纹理
在code应该是这样的:
GLES20.glVertexAttribPointer(texCoordHandler,COORDS_PER_TEXTURE,
GLES20.GL_FLOAT,假的,
textureStride,textureBuffer);
由于这个问题出现了,我又一次改写我的code。添加索引(DRAWORDER),我的顶点和纹理阵列组合成一个顶点数组,而只是引用 vertexBuffer
//包含位置坐标和纹理坐标在<$ C,而不是$ C> textureBuffer 和 vertexBuffer
//只包含位置坐标
我也改变了 GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,vertexCount);
来:
GLES20.glDrawElements(GLES20.GL_TRIANGLES,indices.length,
GLES20.GL_UNSIGNED_SHORT,indexBuffer);
I cannot seem to render a Texture to my square. I have gotten my program to render the blank square with color. Any help is greatly appreciated.
I've redesigned my code to the following and believe that the problem exists with how I'm setting up my Vertex Coordinates and Texture Coordinates. I also get a libc Fatal signal 11 at my glDrawArrays function.
Here are the Vertex and Texture Coordinates:
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,
};
Here's my draw function in my square class:
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");
}
My main problem in the above code was the fact that I was using the textureHandle
instead of the texCoordHandler
in the glVertexAttribPointer //Texture
The code should look like this:
GLES20.glVertexAttribPointer(texCoordHandler, COORDS_PER_TEXTURE,
GLES20.GL_FLOAT, false,
textureStride, textureBuffer);
Since this problem arose I've rewritten my code yet again. Adding indices (draworder), combining my Vertex and Texture arrays into a Vertices array, and just reference a vertexBuffer
//Contains both position coordinates and texture coordinates instead of a textureBuffer
and a vertexBuffer
//Only contains position coordinates
I've also changed the GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
to:
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length,
GLES20.GL_UNSIGNED_SHORT, indexBuffer);
这篇关于OpenGL ES 2.0的Android的纹理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!