首页 > 解决方案 > OpenGL:单个三角形平面的正面和背面是否有不同的光效?

问题描述

比如说,我们有一个带有单个三角形(三个顶点)的网格。给一个直接面对三角形的光源。

空间中的这个单个三角形面(只有一个)在概念上具有两个面,具体取决于相机位置。让我们将面对光线的脸称为正面,而将另一张脸称为背面。我们还将法线向量传递给 OpenGL,其方向是从正面到光源。

我的问题是:对三角形应用照明后,三角形的正面和背面看起来是否相同?或者它们看起来不同,背面更暗,正面更亮?为什么?我对现代的 openGL 和旧的修复功能 opengl 都很好奇,如果它是相关的。

另外,这与面部剔除有什么关系,我们在哪里处理 CCW 三角形前面?我相信不会。而面部剔除的“前”概念是不同的。它告诉三角形(作为一个整体)是正面还是背面,而不是它的两侧。如果我错了,请指出我。

标签: openglgraphicsshader

解决方案


我对现代的 openGL 和旧的修复功能 opengl 都很好奇,如果它是相关的。

使用现代 GL,这很容易:您编写着色器。如果您想区别对待正面和背面,您可以这样做。如果你不想这样,你也可以这样做。请注意,片段着色器可以访问gl_FrontFacing输入,这会告诉它正在处理的是脸部的哪一侧。

在传统的固定功能管道中,这由GL_LIGHT_MODEL_TWO_SIDE可通过以下方式设置的参数控制glLightModel

如果params[这里指的GL_LIGHT_MODEL_TWO_SIDE]为0(或0.0),则指定单面光照,光照方程中只使用前面的材质参数。否则,将指定两侧照明。在这种情况下,背面多边形的顶点使用背面材质参数进行照明,并在计算照明方程之前反转它们的法线。正面多边形的顶点始终使用正面材质参数进行照明,其法线不变。初始值为 0。

因此,使用固定功能管道,您也可以两者兼得。

我的问题是:对三角形应用照明后,三角形的正面和背面看起来是否相同?或者它们看起来不同,背面更暗,正面更亮?

事实也并非如此。脸是亮还是暗很大程度上取决于来自某些光源的入射光与表面法线(您提供)之间的角度。“三角形的正面和背面看起来是否相同”确实是一个奇怪的问题,因为根据定义,您只能看到其中一个表面。现在你可以问对方会有什么样的外观,但由于照明也取决于视图,所以这不是一个有意义的问题。要真正看到另一面,您需要:

  • 翻转三角形方向。但是如果你只是改变顶点的顺序而不改变其他任何东西(尤其是不是法线),得到的光照是一样的。这适用于单面和双面照明模式(假设您对两侧使用相同的材​​料)。

  • 更改查看器位置以从另一侧查看三角形。在双面照明模式下,这将在外观上产生巨大差异,因为正常情况相反。在单面照明中,您也会看到差异,因为镜面反射分量也取决于视角,但漫反射部分实际上不会改变。

  • 您实际上反映了世界中的三角形(包括它的法线)。如果您在双边光照模式下执行此操作,并假设提供的法线垂直于三角形平面,将产生与之前看到的相同的光照,同样有效地,它将使用与之前相同的法线。在单面光照模式下,法线会反转到你之前的状态,所以会再次出现巨大的差异。


推荐阅读