2010-11-03 3 views
3

Я работаю над движком игры в течение месяца, и я закончил основной материал OpenGL. Тем не менее, одна вещь, с которой я не могу работать, как я ожидаю, это освещение. (Примечание: это первый раз, когда я серьезно работал с OpenGL)Open GL Lighting Problem

То, что я хочу, близок к реалистичному моделированию освещения - там, где поверхности, обращенные к свету, освещены больше, чем те, которые расположены дальше, и т. Д. Основной свет должен иметь положение и цвет. Это, как я думал, что это может быть реализовано:

float lightv[4]; // populated with (0.6, 0.6, 0.6, 1) 
float positionv[4]; // populated with (0, 10, 0, 1) 
int lightID = GL_LIGHT0; 
int attenuationType = GL_LINEAR_ATTENUATION; 
float attenuationValue = 1; 
glLightf(lightID, attenuationType, attenuationValue); 
glLightfv(lightID, GL_DIFFUSE, lightv); 
glLightfv(lightID, GL_POSITION, positionv); 
glEnable(lightID); 

Вместо того, чтобы делать то, что я ожидаю, что это сделать, это дает мне зажигая, как если бы был свет, где камера! Каждая поверхность имеет такое же освещение!

Что я делаю неправильно?

Спасибо, я ценю это.

ответ

2

Первое, что нужно сделать, это убедиться, что у вас есть glEnable(GL_LIGHTING);, вызванный в какой-то момент. В прошлом, первое, что нужно проверить, это то, что ваши нормали правильны. Чтобы освещение работало должным образом, вам понадобится нормальный набор для каждой вершины, которую вы рисуете. Если вы уже установили свои нормали, вы должны убедиться, что все они имеют длину единицы. Если они не имеют длины, освещение может действовать странно. Если это все так, как должно быть, вы должны иметь в виду, что когда вы устанавливаете положение света, оно изменяется текущей матрицей Modelview, как если бы это была вершина. Если ни одна из этих вещей не будет актуальной, я посмотрю, смогу ли я что-нибудь придумать.

0

Установите ваше положение света после, вы настроили преобразование GL_MODELVIEW, так как оно зависит от текущей матрицы преобразования. В противном случае вы получите эффект «фары», который вы обнаружили.