【问题标题】:Is this OpenGL lighting working as intended?此 OpenGL 照明是否按预期工作?
【发布时间】:2015-01-22 07:33:25
【问题描述】:

我已经设置了一个包含定向光的非常基本的片段着色器。我正在尝试使用这种定向光照亮单个四边形,一切似乎都按预期工作,但我有一个问题:这个平面四边形的两侧是否应该受到定向光的影响?

当旋转相机时,我注意到四边形的背面和前面一样亮。这应该发生还是应该只点亮四边形的一侧?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    这很正常,因为四边形的背面与正面是“相同的四边形”。它们具有相同的法线,因此照明给出相同的结果。如果你不想要这个,有两个解决方案:

    1. 启用背面剔除。你再也看不到背面了。如果您需要查看某些东西,请绘制另一个四边形,但朝向另一个方向。
    2. 在您的片段着色器中,测试gl_FrontFacing。如果它是假的,否定正常。它可以在没有分支的情况下完成,如下所示:

      正常 = gl_FrontFacing ?正常:-正常;

    【讨论】:

    • 我不明白您在第一段中所说的内容。假设光源在前面的某个地方。由于法线相同,因此背面实际上应该看起来更暗,因为当背面可见时(即朝向观察者),法线指向远离光线。因此,如您在第 2 项中所述,只有在实施两侧照明时,两侧才会同样亮。
    • 顺便说一句,? 运算符意味着一个分支。它基本上只是if 语句的快捷方式。
    • 假设光源在前面,法线指向它。四边形被点亮。背面和正面也是如此,它们是相同的东西。它们被点亮是因为法线指向光线。如果您将相机放在四边形后面,它不会改变它的正常状态,它会保持朝向光线。是不是更清楚了?
    • 运营商?与分支略有不同,尤其是在着色器中。它转换为执行条件赋值(而不是跳转)的指令,因此在实践中它没有分支的缺点。如果您使用 if,编译器可能会将其更改为条件赋值,或者可能不会(特别是如果您在块中有其他代码)。安全总比后悔好。
    • 哦,我想我现在明白你的意思了。如果您使灯光相对于平面保持静止,并且仅移动相机,则这是正确的。这当然是可能的。我想这在很大程度上取决于应用程序和用例。我发现让光线相对于相机保持静止并移动物体更为常见。或者,换个角度看,用相机移动灯光。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    相关资源
    最近更新 更多