Opengl-带VBO纹理的OBJ文件索引列表(GLD元素)
我已经为opengl制作了一个obj加载程序。因此,我读取所有面(一个接一个),并将有序顶点、法线和uv坐标写入(openGL-)缓冲区(GL_数组_缓冲区)。这意味着我将根据obj文件中的“面”部分显示的内容来消除所有必要的顶点、法线和uv坐标。然后我用gldrawArray()绘制它们 。。。都很好 为了节省一些内存,我想使用一个索引列表,并使用gl抽屉元素(),但我遇到了一个问题。请参见以下两张图片: 考虑顶点P0和三角形,以及它在OBJ文件的面部分中是什么 三角Opengl-带VBO纹理的OBJ文件索引列表(GLD元素),opengl,textures,vbo,wavefront,Opengl,Textures,Vbo,Wavefront,我已经为opengl制作了一个obj加载程序。因此,我读取所有面(一个接一个),并将有序顶点、法线和uv坐标写入(openGL-)缓冲区(GL_数组_缓冲区)。这意味着我将根据obj文件中的“面”部分显示的内容来消除所有必要的顶点、法线和uv坐标。然后我用gldrawArray()绘制它们 。。。都很好 为了节省一些内存,我想使用一个索引列表,并使用gl抽屉元素(),但我遇到了一个问题。请参见以下两张图片: 考虑顶点P0和三角形,以及它在OBJ文件的面部分中是什么 三角 T1 -->
T1 --> f vertex(0)/P0/normal(0) vertex(1)/P1/normal(1) vertex(2)/P2/normal(2)
T2 --> f vertex(0)/P0/normal(0) vertex(1)/P1/normal(1) vertex(5)/P5/normal(5)
T3 --> f vertex(0)/P0/normal(0) vertex(2)/P2/normal(2) vertex(3)/P3/normal(3)
。。。很好,但是
T4 --> f vertex(0)/P'0/normal(0) vertex(3)/P3/normal(3) vertex(4)/P4/normal(4)
T5 --> f vertex(0)/P'0/normal(0) vertex(4)/P4/normal(4) vertex(5)/P5/normal(5)
好的,有什么问题吗
vertex(0)/P0/normal(0) != vertex(0)/P'0/normal(0)
我认为解决办法是:
- 每个顶点、法线、UV的列表
- 读取OBJ文件的“面”部分
- 获取顶点的索引->将顶点写入顶点列表中的位置(索引)
- 在正常列表中写入正常接通位置(索引)
- 在uv列表中写入uv on位置(索引)
- 现在问题的顶点有不同的uv坐标,因此
- 如果列表元素不是“空”或非0-->确定有一个顶点,我们必须复制当前顶点、法线和UV,并将它们写入所有列表中的新索引,然后将新索引写入索引列表
对于obj文件的面部分中的同一顶点,是否有更好的方法处理不同uv坐标的问题?我知道这是一个老问题,但我自己也面临同样的问题。我基本上在想你的建议;重建垂直阵列、纹理阵列和法线阵列以匹配标记阵列长度。这将自然地创建重复项,但只需使用gldrawerelements传入适当的数组就相当简单了。不过,我还在做这方面的家庭作业。如果api有更好的方法允许跨越索引,那将非常有用。事实上,为什么这不是一个选择让我非常困惑。