【问题标题】:OpenGL: do front and back side of a single triangle plane have different light effects?OpenGL:单个三角形平面的正面和背面是否有不同的光效?
【发布时间】:2021-09-10 06:21:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 光线取决于法线向量。如果法向量反转,光线就会不同。 (取决于着色器)
  • 鉴于您使用shader 标记了它,这完全取决于您的着色器代码。您的意思是问有关较旧的固定功能照明系统吗?
  • @Rabbid76 我想澄清我的问题。我只有一个三角形面(不是两个)。在你说的法向量反转的情况下,刻面的两边看起来一样吗?
  • @JieChen 不,他们没有,因为当你看背面时,法向量指向相反的方向(这可以在着色器中进行补偿)
  • 他们可以。如果这是基于着色器的 OpenGL,那么正在编写着色器,所以你是编写光照效果的人,所以你告诉我们!

标签: opengl graphics shader


【解决方案1】:

我对现代的 openGL 和旧的修复功能 opengl 都感到好奇。

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

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多