OpenGL 索引缓冲区:处理不同的索引
从 3ds Max 等第三方软件导入自定义网格数据时,您可能会遇到以下差异:顶点和法线索引。由于 OpenGL 对顶点和法线都使用单个索引缓冲区,这带来了挑战。
解决方案 1:组合顶点和法线数据
一种方法是创建一个包含顶点数据和法线数据的组合顶点缓冲区。这需要识别唯一的(顶点索引、法线索引)对并为每对创建一个新顶点。
使用 STL 映射,为每个(顶点索引、法线索引)对创建一个键。迭代三角形,检索每个角的(顶点索引,法线索引)对,并检查地图中是否存在现有条目。如果没有,则使用combinedVertices数组中相应的顶点和法线坐标创建一个新顶点并更新贴图。最后,将每个顶点的组合索引添加到combinedIndices数组中。
示例伪代码:
nextCombinedIdx = 0 indexMap = empty for triangle in input file: for corner in triangle: vertexIdx = ... normalIdx = ... if key(vertexIdx, normalIdx) in indexMap: combinedIdx = indexMap[key(vertexIdx, normalIdx)] else: combinedIdx = nextCombinedIdx indexMap[key(vertexIdx, normalIdx)] = combinedIdx nextCombinedIdx = nextCombinedIdx + 1 combinedVertices[combinedIdx] = inVertices[vertexIdx], inNormals[normalIdx] combinedIndices[combinedIdx] = combinedIdx
解决方案2:排序数据
或者,您可以对顶点/法线数据进行排序以使其兼容使用 glDrawArrays。但是,如果您有重复的顶点,这可能会出现问题。
您需要创建从原始顶点索引到新排序索引的映射。当遇到重复顶点时,为其分配先前见过的对应顶点的索引。然而,这种方法可能需要大量的数据处理和重组。
以上是如何处理 OpenGL 索引缓冲区中不匹配的顶点和法线索引?的详细内容。更多信息请关注PHP中文网其他相关文章!