VBO&x27;Android上的s:在纹理坐标缓冲区中指出正确的图像

VBO&x27;Android上的s:在纹理坐标缓冲区中指出正确的图像,android,opengl-es,Android,Opengl Es,有人知道如何指出存储在HW缓冲区中的纹理缓冲区数组的给定部分吗?我正在画一个三角形的条带,并用一个正方形的图像填充它。在我的纹理中,我有两个相邻的正方形图像,所以纹理坐标缓冲区用总共16个浮点数指出它们 使用软件缓冲区我这样做是为了访问纹理中的第二个图像: textureCoordinateBuffer.position(8); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureCoordinateBuffer); 使用硬件缓冲区我假设我会这样做

有人知道如何指出存储在HW缓冲区中的纹理缓冲区数组的给定部分吗?我正在画一个三角形的条带,并用一个正方形的图像填充它。在我的纹理中,我有两个相邻的正方形图像,所以纹理坐标缓冲区用总共16个浮点数指出它们

使用软件缓冲区我这样做是为了访问纹理中的第二个图像:

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

        }
    }