LWJGL(Java)中OpenGL的奇怪光照行为

时间:2012-03-31 21:28:47

标签: java opengl graphics lwjgl lighting

我是LWJGL / OpenGL的新手,我遇到过这个问题,无论我尝试什么都无法修复:

当我在屏幕上绘制多个立方体时,无论多维数据集与“相机”的距离多远,光线在击中时亮度都相同。这意味着当我在屏幕上绘制大量立方体时,它们会获得相同数量的光线并且看起来很奇怪。

Here's a GIF demonstrating what I mean.

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

如何修复它以使光线在所有区域中混合而不会突然中断?

1 个答案:

答案 0 :(得分:5)

代码的重要部分:

            // 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 wall,请对其所有面使用普通(1,0,0)

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