OpenGL:单个三角形平面的正反面是否有不同的光效?

OpenGL: do front and back side of a single triangle plane have different light effects?

比如说,我们有一个只有一个三角形(三个顶点)的网格。给一个正对着三角形的光源。

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

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

此外,这与面部剔除有什么关系,我们在其中处理 CCW 三角形正面吗?我相信不会。与剔脸术语中的“正面”概念不同。它告诉一个三角形(作为一个整体)是正面还是背面,更不用说它的两侧了。如有错误请指出

I am curious about both the modern openGL and the older fixing-function opengl if it is related.

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

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

If params [it refers to GL_LIGHT_MODEL_TWO_SIDE here] is 0 (or 0.0), one-sided lighting is specified, and only the front material parameters are used in the lighting equation. Otherwise, two-sided lighting is specified. In this case, vertices of back-facing polygons are lighted using the back material parameters and have their normals reversed before the lighting equation is evaluated. Vertices of front-facing polygons are always lighted using the front material parameters, with no change to their normals. The initial value is 0.

因此使用固定功能管道,您也可以做到这两点。

My question is: with the lighting applied to the triangle, do the front and back face of the triangle appear the same? Or they appear differently with the back side darker and front side brighter?

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

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

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

  • 你实际上镜像了世界中的三角形(包括它的法线)。如果您在双侧光照模式下执行此操作,并假设提供的法线垂直于三角形的平面,将产生与之前看到的相同的光照,实际上,它将使用与之前相同的法线。在单侧光照模式下,正常的会和之前的一样,所以又会有很大的不同。