【问题标题】:Strange lighting behaviour with OpenGL in LWJGL (Java)在 LWJGL (Java) 中使用 OpenGL 的奇怪照明行为
【发布时间】:2012-03-31 21:28:46
【问题描述】:

我对 LWJGL/OpenGL 还很陌生,遇到了这个问题,无论我尝试什么都无法解决:

当我在屏幕上绘制多个立方体时,无论立方体离“相机”多远,光线照射到它时的亮度都是相同的。这意味着当我在屏幕上绘制大量立方体时,它们会获得相同数量的光,看起来很奇怪。

Here's a GIF demonstrating what I mean.

我的源码:http://pastebin.com/qd5dsZ89

我怎样才能解决这个问题,以便光线在所有这些地方混合而不会突然中断?

【问题讨论】:

  • Tip:将代码库的大小减少到您认为可能存在问题的小样本。从那里开始玩,看看您是否可以解决解决方案(理想)或观察您的错误可能来自哪里。让别人阅读你的整个代码有点过分。
  • 您想要实现什么样的照明?固定位置照明(太阳),或移动相机(手电筒)?你想让它随着距离而衰减吗?
  • 我的目标是固定灯光,它会随着距离的增加而衰减。我将其设置为随相机移动以进行演示。

标签: java opengl graphics lwjgl lighting


【解决方案1】:

代码的重要部分:

            // Render a wall
            glTexCoord2f(0, 0);
            glNormal3f(wall.a.x > 0 ? 1 : -1, wall.a.y > 0 ? 1 : -1, wall.a.z > 0 ? 1 : -1);
            glVertex3f(wall.a.x, wall.a.y, wall.a.z);
            glTexCoord2f(xS, 0);
            glNormal3f(wall.b.x > 0 ? 1 : -1, wall.b.y > 0 ? 1 : -1, wall.b.z > 0 ? 1 : -1);
            glVertex3f(wall.b.x, wall.b.y, wall.b.z);
            glTexCoord2f(xS, yS);
            glNormal3f(wall.c.x > 0 ? 1 : -1, wall.c.y > 0 ? 1 : -1, wall.c.z > 0 ? 1 : -1);
            glVertex3f(wall.c.x, wall.c.y, wall.c.z);
            glTexCoord2f(0, yS);
            glNormal3f(wall.d.x > 0 ? 1 : -1, wall.d.y > 0 ? 1 : -1, wall.d.z > 0 ? 1 : -1);
            glVertex3f(wall.d.x, wall.d.y, wall.d.z);

如果我没看错,那你的立方体法线向量的 8 个角都指向外面。同一角的所有顶点(不同面)具有相同的法线。因此,您制作一个“圆形”立方体时,单个立方体上没有可见的边缘。

我会给构成立方体一侧的所有顶点相同的法线。例如,对于 x-most 墙,对其所有面使用法线 (1,0,0)

解决方案:使用正确的法向量为每一边调用一次glNormal3f

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2013-02-24
    • 2013-07-18
    • 1970-01-01
    • 2016-11-05
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多