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

Opengl es glVertexPointer应该包含不同的顶点,还是包含所有顶点?,opengl-es,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, faceBuffe

我正在使用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坐标构成

faceBuffer
是指向相关vertexBuffer的索引字节缓冲区

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

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

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

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

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

vertexBuffer
应该包含4组值,还是12组值?
uvBuffer
vertexBuffer
的项目数必须相同吗

基本上,如果顶点具有不同的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:(面A)
顶点2:(面A)
顶点3:(面A)
顶点4:(面B)
顶点5:(面B)
顶点6:(面B)
顶点7:(面C)
顶点8:(面C)
顶点9:(面C)
顶点10:(面D)
顶点11:(面D)
顶点12:(面D)
UV 1:(A面)
紫外线2:(A面)
紫外线3:(A面)
UV 4:(面B)
UV 5:(面B)
UV 6:(面B)
UV 7:(面C)
UV 8:(面C)
UV 9:(面C)
紫外线10:(D面)
紫外线11:(D面)
紫外线12:(D面)
面1:v1/u1、v2/u2、v3/u3
面2:v4/u5、v5/u5、v6/u6
面3:v7/u7、v8/u8、v9/u9
面4:v10/u10、v11/u11、v12/u12

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


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

感谢您快速的回答!将标识符“扩展”到重复的顶点不是什么大问题,我想,我只是认为最好检查一下,我没有遗漏任何明显的特征。
UV 1: <0,0,0> (top left)
UV 2: <0,1,0> (bottom left)
UV 3: <1,0,0> (top right)
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
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