#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). Рассмотрите также возможность размещения источника света за видовым экраном / камерой.