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

far*_*ich 8 graphics android textures opengl-es

我试图将纹理映射到纹理拉伸以适合正方形的正方形上.目前纹理贴图,但它没有映射到正确的位置,OGL执行一些偏差或我不知道的情况.图像是64x64,我尝试过的正方形是-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);
Run Code Online (Sandbox Code Playgroud)

广场:


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);
Run Code Online (Sandbox Code Playgroud)

我正在使用正视角度 gl.glOrthof(-windowRatio, windowRatio, -1,1, -4, 4) .我尝试过drawArrays(),它没有任何区别,也使用了很多组合glTexParameter.问题似乎有两个:(1)图像不伸展以适应,(2)只有正方形的左三角形正确地渲染纹理.我注意到的一点是改变纹理坐标对图像没有影响.如何让它按预期工作?谢谢你的期待.

Chr*_*ica 4

您用作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);
Run Code Online (Sandbox Code Playgroud)

经过

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);
Run Code Online (Sandbox Code Playgroud)

并在渲染代码中替换

gl11.glBindBuffer(GL11.GL_TEXTURE_COORD_ARRAY, textureCoordPointer);
Run Code Online (Sandbox Code Playgroud)

经过

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordPointer);
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为命令从调用它们时绑定的gl...Pointer缓冲区获取数据。GL_ARRAY_BUFFER因此,只需选择适当的缓冲区,然后调用gl...Pointer,然后您就可以将另一个缓冲区绑定到(但是当然,在调用时GL_ARRAY_BUFFER需要绑定索引缓冲区。但正如 Tommy 在评论中已经提到的那样,您也可以不做这些琐碎的事情索引缓冲区和)。GL_ELEMENT_ARRAY_BUFFERglDrawElementsglDrawArrays

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

2   0

3   1
Run Code Online (Sandbox Code Playgroud)

你得到的纹理坐标:

-1,0   1,1

-1,1   0,1
Run Code Online (Sandbox Code Playgroud)

进行建议的更改后,您将得到

1,0   0,0

1,1   0,1
Run Code Online (Sandbox Code Playgroud)

所以你的纹理仍然水平和垂直翻转(我不知道这是否是有意的)。您必须确保您的纹理坐标与您的顶点相匹配。但是在更改了上述缓冲区错误之后,它至少应该看起来好一点。