OpenGL 游戏引擎渲染器

OpenGL Game Engine Renderer

我正在使用 OpenGL 开发渲染引擎,我想知道:

是否应该在模型中创建重复的顶点(对于平面着色,我们需要复制顶点,因为我们有 2 个以上的法线用于单个顶点)或者应该在引擎中实现算法以在顶点需要时计算出来被复制。一个例子是具有锋利边缘和光滑表面的岩石模型。

我认为美术师会在建模软件中复制尖锐边缘的顶点,因为引擎不知道美术师的意图是什么(关于模型特征)。引擎 可以 通过检查面法线之间的角度来识别哪些顶点应该被复制,但对我来说,这样做可能会覆盖模型的特征。

这是专门针对 .obj 模型的,因为不同的出口商可能(?还没有研究过)提供选项来满足这种需求。

您可能应该自己定义重复顶点,只要它们确实不是重复顶点。

在图形编程术语中,"vertex" 应该定义 所有 定义单个点的必要信息。这包括但不一定限于:位置、法线、纹理坐标和无纹理颜色。

所以一般来说,如果比较两个点时此定义数据的 all 相同(加上或减去 Epsilon),则顶点只有 "duplicate"。如果你写一个算法来检测和删除这样的重复项,我会说没有问题。

当您期望一种算法能够准确地决定顶点应该是 "smooth" 还是 "flat" 时,您会遇到问题,因为没有一种算法可以正确判断。特别是在你的情况下:如果你希望岩石 总是 平滑阴影(这对于任何特别磨损的岩石都是合理的)你可能没问题,但考虑到你需要考虑无论是光滑边缘还是锐利边缘,你的算法都会把它搞砸。您将需要两种情况,其中 < 10° angle 平滑着色,> 170° angle 平滑着色。除非模型本身提供这些规则,否则您不会做对。

所以,总结一下:只需在模型中创建重复的顶点。不要试图通过算法来摆脱它。大多数体面的 3d 建模程序应该提供使这个过程相对轻松的功能。