首页 > 后端开发 > C++ > 正文

如何处理 OpenGL 索引缓冲区中不匹配的顶点和法线索引?

Susan Sarandon
发布: 2024-11-24 05:11:12
原创
176 人浏览过

How to Handle Mismatched Vertex and Normal Indices in OpenGL Index Buffers?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板