Странное поведение освещения с OpenGL в LWJGL (Java) - PullRequest
0 голосов
/ 01 апреля 2012

Я довольно новичок в LWJGL / OpenGL, и я столкнулся с этой проблемой, которую не могу исправить, что бы я ни пытался:

Когда я рисую несколько кубов на экране, свет попадает на него с одинаковой яркостью, независимо от того, как далеко куб находится от «камеры». Это означает, что когда я рисую много кубов на экране, они получают одинаковое количество света друг с другом, и это выглядит странно.

Вот ГИФ, демонстрирующий, что я имею в виду.

Мой исходный код: http://pastebin.com/qd5dsZ89

Как я могу исправить это так, чтобы свет сливался со всеми без внезапных перерывов?

1 Ответ

5 голосов
/ 01 апреля 2012

Важный бит вашего кода:

            // 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-стены используйте обычный (1,0,0) для всех ее граней.

Решение: вызовите glNormal3f один раз для каждой стороны с правильным вектором нормалей.

...