我正在使用 OpenGL 开发渲染引擎,我想知道:
是否应该在模型中创建重复的顶点(对于平面着色,我们需要复制顶点,因为单个顶点有 2 个以上的法线),或者应该在引擎中实现算法来计算何时需要复制顶点。一个例子是具有锋利边缘和光滑表面的岩石模型。
对我来说,艺术家会在建模软件中复制锐边的顶点是有道理的,因为引擎不知道艺术家的意图是什么(关于模型特征)。引擎可以通过检查面法线之间的角度来识别应该复制哪些顶点,但对我来说,这样做可能会覆盖模型的特征。
这是专门针对 .obj 模型的,因为不同的导出商可能(?没有研究过)提供满足此需求的选项。
最佳答案
您可能应该自己定义重复的顶点,因为它们不是真正重复的顶点。
在图形编程术语中,“顶点”应该定义定义单个点的所有必要信息。这包括但不一定限于:位置、法线、纹理坐标和无纹理颜色。
因此,一般来说,在比较两个点时,如果所有定义的数据都相同(加上或减去 Epsilon),则顶点才是“重复的”。如果您编写一个算法来检测并删除此类重复项,我会说没有问题。
当您期望算法准确地确定顶点应该是“平滑”还是“平坦”时,您就会遇到问题,因为没有一种算法能够正确判断。特别是在你的情况下:如果你希望岩石总是是平滑阴影的(这对于任何特别磨损的岩石来说都是合理的),你可能没问题,但考虑到你需要它同时考虑平滑和锋利的边缘,你的算法总是会搞砸。您将需要<10°角
平滑着色和>170°角
平坦着色这两种情况。除非模型本身提供这些规则,否则您将无法得到正确的结果。
所以,总结一下:只需在模型中创建重复的顶点即可。不要试图用算法来摆脱它。大多数像样的 3D 建模程序应该提供使此过程相对轻松的功能。
关于c++ - OpenGL 游戏引擎渲染器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36985148/