OpenGL освещает небольшие объекты?

#opengl #graphics #lighting #particles

#opengl #графика #Освещение #частицы

Вопрос:

У меня проблема с освещением при работе с действительно мелкими частицами. Я делаю моделирование жидкости на основе частиц и прямо сейчас визуализирую жидкость в виде действительно крошечных многоугольных сфер (под действительно крошечными я подразумеваю сферы радиусом около 0,03 единиц). Освещение в моей сцене освещает их не так, как я хочу, и я не могу добиться, чтобы это выглядело правильно. Я ищу что-то похожее на мягкое освещение частиц на этом изображении… частицы с правильным освещением

Однако мои частицы выглядят вот так…

Как выглядят мои частицы

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

 GLfloat mat_ambient[] = {0.5, 0.5, 0.5, 1.0};
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess[] = {10.0};
GLfloat light_position[] = {0.0, 0.1, p_z, 1.0};
GLfloat model_ambient[] = {0.5, 0.5, 0.5, 1.0};

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
  

Комментарии:

1. en.wikipedia.org/wiki/Ambient_occlusion

2. похоже, полезная информация, но как мне применить это к моей сцене? Я не использую шейдеры, и я не уверен, как это изменит настройки, которые у меня есть для освещения

3. Применение этого не является тривиальным: вот почему я не сделал это ответом. Чтобы получить более мягкие тени в целом, вы могли бы попробовать добавить несколько источников света (например, 8 источников света, интенсивность каждого 1/8), распределенных по небольшой области рядом с вашим текущим источником, чтобы смягчить края.

4. это хорошая идея, я попробую добавить больше источников света. Спасибо!

Ответ №1:

Спасибо всем за все предложения, но, к сожалению, ничего не сработало. Я поговорил со своим преподавателем графики, и мы определили, что эта проблема на самом деле связана с размером частиц и тем фактом, что OpenGL рассматривает направленные источники света как бесконечно удаленные от любой вершины. Правильным способом исправить это было изменение постоянного ослабления источника света следующим образом…

 glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 10.0);
  

Теперь мои частицы выглядят вот так…

введите описание изображения здесь какое именно освещение мне было нужно!

Ответ №2:

Размер частиц не является проблемой — вы перенасыщаете свои цвета.

Для каждого компонента RGB у вас должно быть ambient diffuse specular <= 1.0

Для сцены, подобной этой, я бы ожидал, что ambient будет не более 0,1 или около того, рассеянность 0,6 или около того, а остальное составляет зеркальность.

Ответ №3:

Похоже, вам нужно уменьшить зеркальную составляющую вашего материала, немного уменьшить окружающий эффект и добавить немного рассеянного затенения (GL_DIFFUSE). Рассмотрите также возможность размещения источника света за видовым экраном / камерой.