Странное поведение освещения с OpenGL в LWJGL (Java)

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

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

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

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

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


person user1248420    schedule 31.03.2012    source источник
comment
Совет. Сократите размер базы кода до небольшого примера того, что, по вашему мнению, может быть проблемой. Поиграйте с ним оттуда и посмотрите, сможете ли вы решить решение (идеальное) или посмотреть, откуда может исходить ваша ошибка. Попросить других прочитать весь ваш код — это слишком.   -  person Makoto    schedule 01.04.2012
comment
Какого освещения вы пытаетесь добиться? Освещение в фиксированном положении (солнце) или перемещение с камерой (фонарик)? Вы хотите, чтобы он уменьшался с расстоянием?   -  person Tim    schedule 01.04.2012
comment
Я стремлюсь к фиксированному свету, который падает с расстоянием. Я настроил его так, чтобы он двигался вместе с камерой для демонстрации.   -  person user1248420    schedule 01.04.2012


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

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

person Ishtar    schedule 31.03.2012