glVertexPointer应该包含不同的顶点还是所有顶点?

时间:2010-08-12 11:16:54

标签: opengl-es

我正在使用OpenGL ES创建一个Android应用程序,需要一些顶点,纹理和普通指针的帮助。我见过的例子停在相当基本的水平,所以我似乎缺少一些信息。

我的基本绘画()过程是

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(3, GL10.GL_FLOAT, 0, uvBuffer);
gl.glDrawElements(GL10.GL_TRIANGLES, faceBufferLength, GL10.GL_UNSIGNED_BYTE, faceBuffer);

顶点和uv是根据各个顶点和uv的各种x,y和z坐标构造的FloatBuffers。

faceBuffer是指向相关vertexBuffer的索引的ByteBuffer。

每个面由三个顶点组成,每个面为它的顶点定义一个不同的 UV(正确吗?)

因此,我的问题是,我是否需要在所有缓冲区中重新定义每个不同的顶点/ uv组合?

考虑一个简单的四面体。它由

组成

4个顶点(三个“基础”和一个“点”):

Vertex 1: <1,1,1> (the point)
Vertex 2: <2,1,0>
Vertex 3: <0,0,0>
Vertex 4: <2,0,0>

3 uv坐标(所有面具有相同的图像)

UV 1: <0,0,0> (top left)
UV 2: <0,1,0> (bottom left)
UV 3: <1,0,0> (top right)

4张脸:

Face 1: v1/u1, v2/u2, v3/u3
Face 2: v1/u1, v3/u2, v4/u3
Face 3: v1/u1, v4/u2, v2/u3
Face 4: v2/u1, v3/u2, v4/u3

所以我的问题是,如何告诉GL哪个UV用于每个面/顶点?

vertexBuffer中应该有4组值,还是12?必须uvBuffervertexBuffer具有相同数量的项目吗?

基本上,如果它们具有不同的UV和/或正常值,我可以“重复使用”顶点吗?

或者我必须是独一无二的:

Vertex  1: <1,1,1> (face A)
Vertex  2: <2,1,0> (face A)
Vertex  3: <0,0,0> (face A)
Vertex  4: <1,1,1> (face B)
Vertex  5: <0,0,0> (face B)
Vertex  6: <2,0,0> (face B)
Vertex  7: <1,1,1> (face C)
Vertex  8: <2,0,0> (face C)
Vertex  9: <2,1,0> (face C)
Vertex 10: <2,1,0> (face D)
Vertex 11: <0,0,0> (face D)
Vertex 12: <2,0,0> (face D)

UV  1: <0,0,0> (face A)
UV  2: <0,1,0> (face A)
UV  3: <1,0,0> (face A)
UV  4: <0,0,0> (face B)
UV  5: <0,1,0> (face B)
UV  6: <1,0,0> (face B)
UV  7: <0,0,0> (face C)
UV  8: <0,1,0> (face C)
UV  9: <1,0,0> (face C)
UV 10: <0,0,0> (face D)
UV 11: <0,1,0> (face D)
UV 12: <1,0,0> (face D)

Face 1: v1/u1, v2/u2, v3/u3
Face 2: v4/u5, v5/u5, v6/u6
Face 3: v7/u7, v8/u8, v9/u9
Face 4: v10/u10, v11/u11, v12/u12

1 个答案:

答案 0 :(得分:3)

复制位置数据,就像在vertexData中有12个顶点位置一样。对纹理坐标执行相同的操作。

正如您所注意到的那样,索引所有具有相同索引的数组,因此复制顶点位置是标准的,这样每个索引都有自己的顶点数据(位置+ UV)。