VBO&x27;Android上的s:在纹理坐标缓冲区中指出正确的图像
有人知道如何指出存储在HW缓冲区中的纹理缓冲区数组的给定部分吗?我正在画一个三角形的条带,并用一个正方形的图像填充它。在我的纹理中,我有两个相邻的正方形图像,所以纹理坐标缓冲区用总共16个浮点数指出它们 使用软件缓冲区我这样做是为了访问纹理中的第二个图像:VBO&x27;Android上的s:在纹理坐标缓冲区中指出正确的图像,android,opengl-es,Android,Opengl Es,有人知道如何指出存储在HW缓冲区中的纹理缓冲区数组的给定部分吗?我正在画一个三角形的条带,并用一个正方形的图像填充它。在我的纹理中,我有两个相邻的正方形图像,所以纹理坐标缓冲区用总共16个浮点数指出它们 使用软件缓冲区我这样做是为了访问纹理中的第二个图像: textureCoordinateBuffer.position(8); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureCoordinateBuffer); 使用硬件缓冲区我假设我会这样做
textureCoordinateBuffer.position(8);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureCoordinateBuffer);
使用硬件缓冲区我假设我会这样做:
// setup HW buffers
// ...
// select HW buffers
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER,vertexCoordinateBufferIndex);
gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordinateBufferIndex);
// Point out the first image in the texture coordinate buffer
gl11.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 0);
// Draw
// ...
如果您想指出纹理中的第一个图像,该方法非常有效。
但我想访问第二张图像-因此我假设我在最后一行中这样做:
// Point out the second image in the texture coordinate buffer - doesn't work!
gl11.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 8);
但这会渲染一个褪色的图像
有谁知道如何正确理解这一点吗?您可能想看看NeHe Android教程。他们会详细讨论这一点,并向您展示您需要做什么 具体而言,您要学习的课程如下: 第六课 您可能没有绑定和启用缓冲区,以下是教程中的一个片段:
public void draw(GL10 gl) {
//Bind our only previously generated texture in this case
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
//Point to our buffers
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//Set the face rotation
gl.glFrontFace(GL10.GL_CCW);
//Enable the vertex and texture state
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
//Draw the vertices as triangles, based on the Index Buffer information
gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);
//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
信贷:疯狂设计-
编辑:
我知道你在问什么。这里有更多的代码可以帮助您。如果您查看android的SpriteMethodTest应用程序:
你会注意到Chris Pruett(该应用程序的开发人员)向你展示了在屏幕上绘制纹理的多种方法。下面是您正在寻找的代码(我相信)
Grid.java
具体地说,您将需要查看代码,其中包含的错误分支!博物馆硬件缓冲区。我建议您查看完整的Grid.java文件,以获得更好的表示方法,因为他还设置了纹理指针,并使OpenGL能够开始绘制
另一方面:我建议读一下Chris的文章:
他了解了这个应用程序的功能,并发现绘制纹理最有效的方法是。嘿,谢谢,我将查看教程。在您的示例中,您使用的是SW缓冲区,但我指的是HW缓冲区,我对我的问题进行了编辑以使其更清楚。@emolaus我在回答中添加了更多内容,请看一看。哦,伙计,我现在明白了,他用索引缓冲区绑定顶点和纹理坐标缓冲区之间的数据。非常感谢@埃莫洛斯np,很高兴我能帮上忙。
public void beginDrawingStrips(GL10 gl, boolean useTexture) {
beginDrawing(gl, useTexture);
if (!mUseHardwareBuffers) {
gl.glVertexPointer(3, mCoordinateType, 0, mVertexBuffer);
if (useTexture) {
gl.glTexCoordPointer(2, mCoordinateType, 0, mTexCoordBuffer);
}
} else {
GL11 gl11 = (GL11)gl;
// draw using hardware buffers
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mVertBufferIndex);
gl11.glVertexPointer(3, mCoordinateType, 0, 0);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mTextureCoordBufferIndex);
gl11.glTexCoordPointer(2, mCoordinateType, 0, 0);
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, mIndexBufferIndex);
}
}
// Assumes beginDrawingStrips() has been called before this.
public void drawStrip(GL10 gl, boolean useTexture, int startIndex, int indexCount) {
int count = indexCount;
if (startIndex + indexCount >= mIndexCount) {
count = mIndexCount - startIndex;
}
if (!mUseHardwareBuffers) {
gl.glDrawElements(GL10.GL_TRIANGLES, count,
GL10.GL_UNSIGNED_SHORT, mIndexBuffer.position(startIndex));
} else {
GL11 gl11 = (GL11)gl;
gl11.glDrawElements(GL11.GL_TRIANGLES, count,
GL11.GL_UNSIGNED_SHORT, startIndex * CHAR_SIZE);
}
}