如何在不同情况下处理具有多个法线的顶点
How to deal with vertex with several normals under different situations?
大家好!我目前正在使用OpenGL进行一个项目。我知道使用索引顶点属性进行渲染可以节省大量内存。这要求每个顶点属性都应该是唯一的,否则索引渲染的优势将不成立。因此,问题来了:
假设我想从OBJ文件中渲染一个具有立方体底座的雕像。据我所知,对于OBJ格式,一个顶点可以由多个面共享。这意味着顶点可以用几个不同的法线指定,这些法线是共享顶点的面的法线。
情况1:对于雕像,我希望平均每个顶点的法线,以便仅获得该顶点的一个法线,因此可以使用索引渲染。此外,每个面内的插值法线使雕像看起来更平滑。
情况2:对于立方体基底,当渲染不同的边时,我希望对顶点使用不同的法线,以使表面看起来像实际情况一样平坦。
是否有一种通用的方法来处理上述情况
我必须把雕像和它的底座分成不同的物体并区别对待吗
OBJ文件格式使其不必要地混淆(许多其他资源也是如此):它们混淆了术语"顶点"answers"位置"。
顶点是位置、法线和其他属性的整个元组。如果只更改其中一个属性,则会得到不同的顶点。就OpenGL而言,它处理的是顶点。因此,如果一个位置由多个面共享,但其他属性不同,则处理的是不同的顶点。
如果你想要最好的性能,那么强烈建议将这些属性级几何体规范扩展到顶点级规范,并重建索引列表以引用顶点而不是属性(OBJ指的是属性)。
使用现代OpenGL,实际上可以有多个索引缓冲区,并且在顶点着色器中使用顶点ID访问索引缓冲区以将索引获取到属性缓冲区中。可以吗?对有效率的没有那么多,它引入了双重间接寻址。
相关文章:
- 如何循环打印顶点结构
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 如何在不同情况下处理具有多个法线的顶点
- OpenGL实例绘图如何处理顶点输入的限制
- 片段着色器是否处理顶点着色器中的所有像素
- OpenGL中处理顶点的最佳技术?C++