2010-08-12 147 views
2

我正在使用OpenGL ES创建一个Android应用程序,并且需要一些关于顶点,纹理和常规指针的帮助。我见过的例子停在一个相当基本的水平,所以我似乎缺少一些信息。glVertexPointer是否应该包含不同的顶点或所有顶点?

我的基本拉伸()过程是

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是从不同的x,各个顶点和UV的的y和z坐标构造FloatBuffers。

faceBuffer是指向相关顶点缓冲区的索引的ByteBuffer。

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

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

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

4个顶点(3 '基地' 和一个 '点'):

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 

回答

3

复制的位置数据,如在vertexData 12个顶点位置。对纹理坐标做同样的操作。

正如您注意到的那样,索引全部指数相同的数组,所以标准复制顶点位置以便每个索引都有自己的顶点数据(位置+ UV)。

+0

感谢您的快速回答!将标识符“展开”为重复的顶点并不是一个大问题,我想我最好检查一下我是否在某个地方缺少一个明显的功能。 – Cylindric 2010-08-12 12:07:06

相关问题