c++ - OpenGL 游戏引擎渲染器

标签 c++ opengl 3d rendering

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

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

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

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

最佳答案

您可能应该自己定义重复的顶点,因为它们不是真正重复的顶点。

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

因此,一般来说,在比较两个点时,如果所有定义的数据都相同(加上或减去 Epsilon),则顶点才是“重复的”。如果您编写一个算法来检测并删除此类重复项,我会说没有问题。

当您期望算法准确地确定顶点应该是“平滑”还是“平坦”时,您就会遇到问题,因为没有一种算法能够正确判断。特别是在你的情况下:如果你希望岩石总是是平滑阴影的(这对于任何特别磨损的岩石来说都是合理的),你可能没问题,但考虑到你需要它同时考虑平滑和锋利的边缘,你的算法总是会搞砸。您将需要<10°角平滑着色和>170°角平坦着色这两种情况。除非模型本身提供这些规则,否则您将无法得到正确的结果。

所以,总结一下:只需在模型中创建重复的顶点即可。不要试图用算法来摆脱它。大多数像样的 3D 建模程序应该提供使此过程相对轻松的功能。

关于c++ - OpenGL 游戏引擎渲染器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36985148/

相关文章:

c++ - 旧 cvSmooth(src, dst, CV_MEDIAN, 3) 的 C++ 替代品是什么?

c++ - 为什么在函数定义中缺少正式参数名称的 C++ 代码编译时没有警告?

c++ - OpenGL GLM 矩阵计算不起作用

opengl - Win32 的 CoreImage

c# - XNA SpriteBatch.Draw 3D 向量 HLSL

c++ - 了解此 `const&` 特化的必要性

初始化新对象时的C++默认构造函数和POD问题

c++ - 显示列表最适合这个吗? (OpenGL)

java - 3D "free"相机的三角学

c# - 计算三角多边形网格中的孔