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)只有正方形的左三角形正确地渲染纹理.我注意到的一点是改变纹理坐标对图像没有影响.如何让它按预期工作?谢谢你的期待.
您用作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)
所以你的纹理仍然水平和垂直翻转(我不知道这是否是有意的)。您必须确保您的纹理坐标与您的顶点相匹配。但是在更改了上述缓冲区错误之后,它至少应该看起来好一点。
| 归档时间: |
|
| 查看次数: |
1981 次 |
| 最近记录: |