3 回答
TA贡献1806条经验 获得超5个赞
对顶点和法线使用单独索引的文件类型与OpenGL顶点模型非常直接匹配。正如您所注意到的,OpenGL使用一组索引。
您需要做的是为输入中的每个唯一(顶点索引,法线索引)对创建一个OpenGL顶点。这需要一些工作,但并不是非常困难,特别是如果您使用可用的数据结构。STL map
适用于此,以(顶点索引,普通索引)对作为键。我不打算提供完整的C ++代码,但我可以将其描绘出来。
假设您已经将顶点读入某种数组/矢量数据结构inVertices
,其中vertexIdx
存储了带索引的顶点的坐标inVertices[vertexIdx]
。法线也是如此,其中normalIdx
存储了具有索引的法线向量inNormals[normalIdx]
。
现在你可以阅读一个三角形列表,每个三角形的每个角都由a vertexIdx
和a给出normalIdx
。我们将构建一个combinedVertices
包含顶点和法线坐标的新数组/向量,以及一个新的combinedIndices
索引列表。伪代码:
nextCombinedIdx = 0indexMap = empty loop over triangles in input file loop over 3 corners of triangle read vertexIdx and normalIdx for the corner if indexMap.contains(key(vertexIdx, normalIdx)) then combinedIdx = indexMap.get(key(vertexIdx, normalIdx)) else combinedIdx = nextCombinedIdx indexMap.add(key(vertexIdx, normalIdx), combinedIdx) nextCombinedIdx = nextCombinedIdx + 1 combinedVertices.add(inVertices[vertexIdx], inNormals[normalIdx]) end if combinedIndices.add(combinedIdx) end loop end loop
TA贡献1829条经验 获得超7个赞
我设法做到这一点,没有将索引缓冲区传递给OpenGL,glDrawArrays(GL_TRIANGLES,..)
我做了以下内容:填充顶点数组,顶点索引数组,法线数组和法线索引数组。然后我用排序数据创建了新的顶点和普通数组,并将它们传递给OpenGL。
for i = 0; i < vertexIndices.size(); ++i newVertexArray[i] = oldVertexArray[vertexIndices[i]];for i = 0; i < normalsIndices.size(); ++i newNormalsArray[i] = oldNormalsArray[normalsIndices[i]];
我对它进行了优化,根本没有填充索引数组。但优化取决于程序员读取网格数据的方式。
TA贡献1880条经验 获得超4个赞
嗯,是的,如果你不关心内存使用,效率和功耗,那就更简单了。在或多或少的规则网格中,顶点通常由大约6个三角形共享。根据使用索引方法的顶点缓存命中率,我希望您在GPU上创建大约3-6倍的顶点处理负载,相应的内存带宽会增加。您还将使用接近6倍的内存。考虑到使用索引构建网格只需要几行代码,我认为这绝对值得
- 3 回答
- 0 关注
- 479 浏览
添加回答
举报