【发布时间】:2014-06-14 11:18:36
【问题描述】:
我有一个自定义文件格式,其中包含 3D 网格所需的所有信息(从 3ds Max 导出)。我已经提取了顶点、顶点索引和法线的数据。
我将顶点数据、顶点索引和法线数据传递给 OpenGL,并通过调用 glDrawElements(GL_TRIANGLES,...) 来渲染网格
一切看起来都正常,但正常。问题是法线有不同的指数。由于 OpenGL 只能使用一个索引缓冲区,因此它对顶点和法线都使用该索引缓冲区。
如果你能建议我如何解决这个问题,我将非常感激。
需要注意的重要一点是顶点/法线数据没有“排序”,因此我无法使用glDrawArrays(GL_TRIANGLES,...) 的功能 - 网格无法正确渲染。
有没有一种方法/算法可以用来对数据进行排序,以便可以使用 glDrawArrays(GL_TRIANGLES,..) 正确绘制网格?但即使有一种算法,还有一个问题——我将不得不复制一些顶点(因为我的顶点缓冲区由唯一的顶点组成——例如,如果你有立方体,我的缓冲区将只有 8 个顶点)而且我不确定如何做到这一点。
【问题讨论】:
-
"问题是法线有不同的索引。"为什么?重新排列索引缓冲区,使法线与顶点匹配。更好的是,交错顶点信息。
-
在某些网格中,我得到的法线比顶点多,因此无法匹配索引。平时这样吗?
-
哦,是的,对于某些着色效果,您可能会在同一点获得顶点但具有不同的法线。您将不得不重新排列数据,以便所有内容都对齐,具体取决于您的属性是什么以及您使用的文件格式。但是现在,你还没有真正问过问题,所以我不知道该回答什么。
标签: c++ opengl 3d rendering mesh