OpenGL не учитывает расстояние до позиционного источника света GL_DIFFUSE.

Я хочу поставить позиционный свет в свою сцену. Я ожидаю, что удаленные объекты будут получать меньше света, но opengl просто заботится об угле между нормалью к поверхности и источником света. Я делаю что-то не так или мне нужно добавить еще одну функцию?

GLfloat lightIntensity=1.0;
GLfloat main_position[] = {0.0, 0.0, 1.0, 1.0};
GLfloat light_ambient[] = {0.2, 0.2, 0.2, 0.0};
GLfloat light_diffuse[] = {lightIntensity, lightIntensity, lightIntensity, 1.0};
GLfloat light_specular[] = {0.0, 0.0, 0.0, 0.0};

/* Enable a single OpenGL light. */
glLightfv(GL_LIGHT0, GL_POSITION, main_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);

Когда я запускаю код, 2 объекта с одинаковой нормалью поверхности имеют одинаковое освещение, даже если они находятся на разном расстоянии от источника света.


person fukaraadam    schedule 04.08.2019    source источник
comment
Для света, зависящего от расстояния, вы должны установить параметры затухания GL_LINEAR_ATTENUATION соответственно GL_QUADRATIC_ATTENUATION. См. glLight. По умолчанию свет постоянный, не зависящий от расстояния.   -  person Rabbid76    schedule 04.08.2019


Ответы (1)


Для света, зависящего от расстояния, вы должны установить параметры затухания GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION соответственно GL_QUADRATIC_ATTENUATION. См. glLight. По умолчанию свет постоянный, не зависящий от расстояния.

Ослабление света указано в OpenGL 2.0. Спецификация – 2.14.1 Освещение, стр. 62.
Коэффициент затухания света определяется как:

att = 1 / (kc + kl * d + kq * d * d)

d  ... distance from the light source to the fragment
kc ... constant attenuation
kl ... linear attenuation
kq ... quadratic attenuation 

Значение по умолчанию для постоянного затухания равно 1, для линейного и квадратичного затухания оно равно 0. Это приводит к тому, что коэффициент, не зависящий от расстояния, равен 1.

например Далее устанавливается затухание, где коэффициент затухания равен <= 1.0/255.0 на расстоянии max_dist:

float max_dist = ...;
float threshold = 1.0f/255.0f;

float kc = 0.0f;
float kq = 0.0f;
float kl = (1.0f/threshold - kc - kq*max_dist*max_dist) / max_dist;

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION,  kc);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION,    kl);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, kq);

Для квадратичного затухания то же самое может быть достигнуто с помощью

float kc = 0.0f;
float kl = 0.0f;
float kq = (1.0f/threshold - kc - kl*max_dist) / (max_dist*max_dist);
person Rabbid76    schedule 05.08.2019