gpt4 book ai didi

android - Opengl ES 1.1/Android——2011 年纹理映射到正方形的崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:56:55 25 4
gpt4 key购买 nike

我正在尝试将纹理映射到一个正方形上,其中纹理会拉伸(stretch)以适合正方形。目前是纹理贴图,但它没有映射到正确的位置,OGL 执行了一些我不知道的倾斜等。图像是 64x64,我试过的方 block 是从 -2 到 2(hor 和 ver)和 -1 到 1。这是图像:

enter image description here纹理代码为:


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();

and the code for the rendering is:


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

我正在使用正交透视gl.glOrthof(-windowRatio, windowRatio, -1,1, -4, 4).我已经尝试了 drawArrays(),这没有任何区别,并且还使用了 glTexParameter 的多种组合。问题似乎是双重的:(1) 图像没有拉伸(stretch)以适合,(2) 只有正方形的左三角形正确渲染纹理。我注意到改变纹理坐标对图像没有影响。我如何让它按预期工作?感谢您的关注。

最佳答案

您使用 GL_TEXTURE_COORD_ARRAY 作为缓冲区绑定(bind)点。那是错误的。 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 命令在它们被调用时从绑定(bind)到 GL_ARRAY_BUFFER 的缓冲区中获取数据。所以只要选择合适的缓冲区,然后调用gl...Pointer 就可以绑定(bind)另一个缓冲区到GL_ARRAY_BUFFER(但索引缓冲区需要绑定(bind)到 GL_ELEMENT_ARRAY_BUFFER 当然是在调用 glDrawElements 时。但是正如 Tommy 在评论中已经提到的那样,您也可以不使用普通的索引缓冲区而使用 glDrawArrays)。

因此,由于对 glBindBuffer(GL_TEXTURE_COORD_ARRAY, ...) 的调用失败(因为 GL_TEXTURE_COORD_ARRAY 不是有效的绑定(bind)点),当设置纹理坐标指针。但是因为你指定你的顶点有 3 个组件和你的 texcoords 2,你实际上得到 { 1f, 1f, 0f, 1f, -1f, 0f, -1f, 1f } 作为纹理坐标(第一个顶点数组的八个值)。因此,当您将数组渲染为

2   0

3 1

你得到纹理坐标:

-1,0   1,1

-1,1 0,1

完成建议的更改后,您将获得

1,0   0,0

1,1 0,1

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

关于android - Opengl ES 1.1/Android——2011 年纹理映射到正方形的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6020829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com