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