0

我现在正在做一个 OpenGL 项目。我使用每个顶点法线进行照明计算,这会导致它们自动平滑(我认为这称为gara-something shading)。这开始使用硬编码模型进行一些低多边形设计 - 但由于自动平滑,它们看起来很奇怪。

Blender 有一个网格边缘分割选项,它完全符合我的要求。它变成模型

由此

对此

不必重写我的渲染系统以允许每个顶点法线平滑照明和每个面法线硬照明,我想知道是否有人知道 Blender 的边缘分割算法是如何工作的,以便我可以在我的硬编码模型中重新创建它。

使用 Blender,我将正常导出的 .obj 与边缘分割的对应项进行了比较,但我无法完全理解其中的区别。

非常感谢。

4

3 回答 3

0

那将是Gouraud 阴影。从外观上看,这里没有进行几何处理。这只是一个不同的着色模型。

在 OpenGL 中,对于每个三角形,您需要用相同的法线绘制所有三个顶点,该法线是两个三角形边的叉积。然后,您将看到一个与您的图像具有相同平面阴影的网格。

如果每个顶点都有自己的法线,并且这些法线在三角形中并不完全相等,OpenGL 将在面的表面上插入差异,从而产生从顶点到顶点的更平滑的阴影过渡。这是平滑的(gouraud 着色)。

因此,总而言之,您可以通过更改相对于三角形绘制法线的方式来实现这一点。

于 2016-06-20T06:11:49.550 回答
0

我没有足够的评论积分,所以这里有一个答案..

一般来说,我同意 lfgtm:如果每个顶点有 1 个法线,但顶点由多个三角形共享(重用,即索引),那么您无法获得“平坦”外观或分裂边缘,因为您错过了额外的法线。您将不得不复制顶点。

但是既然您提到了 OBJ 导出,您是否尝试过在 OBJ 导出选项中勾选“平滑组”选项:

在此处输入图像描述

这将根据您标记为锐利的边缘创建平滑组(在编辑模式下:网格 -> 边缘 -> 标记锐利)。如果您的引擎在 OBJ 文件中支持这些平滑组,您将保持这种锐利的边缘效果。您可以使用 Edge Split 修改器在 Blender 中预览这些锐边(勾选“Sharp Edges”选项):

在此处输入图像描述

于 2016-06-20T14:16:49.013 回答
0

Blender 的边缘分割修改器通过破坏网格来实现它的结果,如果您应用边缘分割修改器,您将获得一个面未连接的网格。

您要研究的是平滑阴影和平坦阴影之间的区别

着色样本

如果你用谷歌搜索“opengl flat shading”,你会发现几个类似这样的项目,建议使用glShadeModel(GL_FLAT);

于 2016-06-20T18:00:34.123 回答