Opengl ES 1.1 / Android – 2011年的纹理映射到一个平方的崩溃

我正在尝试将纹理映射到纹理延伸至正方形的正方形上。 目前纹理贴图,但它没有映射到正确的位置和OGL执行一些歪斜或这样的,我不知道。 图像是64×64,我试过的广场是从-2到2(hor和ver)和-1到1.这里是图像:

在这里输入图像说明 纹理代码是:

float texture[] = { 0,0,0,1, 1,0,1,1 }; ByteBuffer byteBuf = ByteBuffer.allocateDirect(texture.length * 4); byteBuf.order(ByteOrder.nativeOrder()); FloatBuffer textureBuffer = byteBuf.asFloatBuffer(); textureBuffer.put(texture); textureBuffer.flip(); int[] buffer = new int[1]; gl11.glGenBuffers(1, buffer, 0); textureCoordPointer = buffer[0]; gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, textureCoordPointer); gl11.glBufferData(GL11.GL_TEXTURE_COORD_ARRAY, textureBuffer.capacity() * 4, textureBuffer, GL11.GL_STATIC_DRAW); gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, 0); Bitmap bitmap = BitmapFactory.decodeResource(context .getResources(),R.drawable.afd); int textures[] = new int[1]; gl.glGenTextures(1, textures, 0); texturePointer = textures[0]; gl.glBindTexture(GL10.GL_TEXTURE_2D, texturePointer); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); bitmap.recycle(); 

而渲染的代码是:

 gl11.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerSquare); gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0); gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indexPointerSquare); gl.glBindTexture(GL10.GL_TEXTURE_2D, texturePointer); gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, textureCoordPointer); gl11.glTexCoordPointer(2, GL10.GL_FLOAT, 0, 0); gl11.glPushMatrix(); gl11.glScalef(.4f,.4f,0); gl11.glColor4f(1,1,1,1); gl11.glDrawElements(GL11.GL_TRIANGLE_STRIP, indicesSquare, GL11.GL_UNSIGNED_SHORT, 0); gl11.glPopMatrix(); gl.glBindTexture(GL10.GL_TEXTURE_2D, 0); 

广场:

 GL11 gl11 = (GL11) gl; FloatBuffer vertexSquareBuffer = ByteBuffer.allocateDirect(verticesSquare * 3 * 4) .order(ByteOrder.nativeOrder()).asFloatBuffer(); ShortBuffer indexSquareBuffer = ByteBuffer.allocateDirect(indicesSquare * 2) .order(ByteOrder.nativeOrder()).asShortBuffer(); float vertices[] = { 1f, 1f, 0, 1f, -1f, 0, -1f, 1f, 0, -1f, -1f, 0 }; short indices[] = { 0, 1, 2, 3 }; vertexSquareBuffer.put(vertices); indexSquareBuffer.put(indices); indexSquareBuffer.flip(); vertexSquareBuffer.flip(); int[] bufferSquare = new int[1]; gl11.glGenBuffers(1, bufferSquare, 0); vertexPointerSquare = bufferSquare[0]; gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerSquare); gl11.glBufferData(GL11.GL_ARRAY_BUFFER, vertexSquareBuffer.capacity() * 4, vertexSquareBuffer, GL11.GL_STATIC_DRAW); gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0); gl11.glGenBuffers(1, bufferSquare, 0); indexPointerSquare = bufferSquare[0]; gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indexPointerSquare); gl11.glBufferData(GL11.GL_ELEMENT_ARRAY_BUFFER, indexSquareBuffer.capacity() * 2, indexSquareBuffer, GL11.GL_STATIC_DRAW); 

我正在使用一个ortho透视gl.glOrthof(-windowRatio, windowRatio, -1,1, -4, 4) 。 我已经试过drawArrays(),这没有什么区别,也使用了许多glTexParameter组合。 这个问题似乎有两个方面:(1)图像不能伸展以适应,(2)只有正方形的左三angular形正确地呈现纹理。 我注意到的是,改变纹理坐标对图像没有影响。 我如何才能达到预期的效果? 感谢您的期待。

Solutions Collecting From Web of "Opengl ES 1.1 / Android – 2011年的纹理映射到一个平方的崩溃"

您使用GL_TEXTURE_COORD_ARRAY作为缓冲区绑定点。 这是错误的。 glTexCoordPointer从当前的GL_ARRAY_BUFFER获取数据,就像glVertexPointer 。 所以在你的第一部分替代

 gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, textureCoordPointer); gl11.glBufferData(GL11.GL_TEXTURE_COORD_ARRAY, textureBuffer.capacity() * 4, textureBuffer, GL11.GL_STATIC_DRAW); gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, 0); 

通过

 gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordPointer); gl11.glBufferData(GL11.GL_ARRAY_BUFFER, textureBuffer.capacity() * 4, textureBuffer, GL11.GL_STATIC_DRAW); gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0); 

并在渲染代码中替代

 gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, textureCoordPointer); 

通过

 gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordPointer); 

这是因为gl...Pointer命令从被调用时绑定到GL_ARRAY_BUFFER的缓冲区中获取数据。 所以只要select适当的缓冲区,然后调用gl...Pointer ,然后你可以绑定另一个缓冲区到GL_ARRAY_BUFFER (但是当调用glDrawElements ,索引缓冲区需要绑定到glDrawElements ,当然,但是正如Tommy已经在评论中提到的那样,你也可以没有简单的索引缓冲区和glDrawArrays )。

因此,对glBindBuffer(GL_TEXTURE_COORD_ARRAY, ...)的调用失败(因为GL_TEXTURE_COORD_ARRAY不是有效的绑定点),所以当设置texcoord指针时,顶点缓冲区仍然被绑定。 但是由于你指定的顶点有3个组件和你的texcoords 2,所以你实际上得到{ 1f, 1f, 0f, 1f, -1f, 0f, -1f, 1f }作为纹理坐标(顶点数组的前8个值) 。 所以当你渲染你的数组

 2 0 3 1 

你得到的纹理坐标:

 -1,0 1,1 -1,1 0,1 

提出修改后,你会得到

 1,0 0,0 1,1 0,1 

所以你的纹理仍然是水平和垂直翻转(我不知道这是否是有意的)。 你必须确保你的textrue坐标匹配你的顶点。 但改变你上面提到的缓冲区错误后,至less应该看起来好一点。