c++ - 不同情况下如何处理多条法线的顶点?

标签 c++ opengl indexing opengl-es normals

各位!我目前正在使用 OpenGL 进行一个项目。我知道使用索引顶点属性进行渲染可以节省大量内存。这就要求每个顶点属性都应该是唯一的,否则索引渲染的优势将无法实现。那么,问题来了:

假设我想从 OBJ 文件中渲染立方体底座的雕像。据我所知,对于 OBJ 格式,一个顶点可以由多个面共享。这意味着可以用几个不同的法线指定顶点,这些法线是共享顶点的小平面的法线。

情况 1: 对于雕像,我想对每个顶点的法线进行平均以获得该顶点的法线,因此可以使用索引渲染。此外,每个面内的插值法线使雕像外观更加光滑。

情况2:对于立方体底,我想在渲染不同的边时对顶点使用不同的法线,使表面看起来像实际一样平坦。

是否有一种通用的方法来处理上述情况?

我是否必须将雕像及其底座分成不同的对象并区别对待?

最佳答案

OBJ 文件格式造成了不必要的混淆(许多其他资源也是如此):它们混淆了术语“顶点”和“位置”。

顶点是位置、法线和其他属性的完整元组。如果您只更改其中一个属性,您会得到一个不同的顶点。就 OpenGL 而言,它处理顶点。因此,如果一个位置由多个面共享,但在其他属性上存在差异,那么您正在处理不同的顶点。

如果您想要最佳性能,那么强烈建议将这些属性级几何规范扩展为顶点级规范,并重建索引列表以引用顶点而不是属性(OBJ 引用属性)。

使用现代 OpenGL,实际上可以有多个索引缓冲区,并且在顶点着色器中使用顶点 ID 访问索引缓冲区,从而将索引放入属性缓冲区。可行吗?是的;高效的?不是那么多,它引入了双重间接。

关于c++ - 不同情况下如何处理多条法线的顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29135952/

相关文章:

c++ - 我们可以使用 Qt(64) 生成一个可以在 32 位窗口和 64 位窗口上运行的应用程序吗?

java - 为什么不能过度使用虚函数?

c++ - SDL 不显示形状

opengl - 指定为 GL_RGBA 的内部格式的什么数据类型?

python - 快速索引 : Cython with numpy array of bool and str

python - 你如何在循环中找到 Python 数组中元素的索引

c++ - 在 GTK3 TreeView 中包装文本

c++ - 对整数除法的哪个操作数进行 static_cast 以获得浮点结果是否重要?

java - JOGL - 监控 GPU 内存

javascript - 性能: findIndex vs Array.原型(prototype).map