OpenGL свет уменьшить отражение

Я пытаюсь применить свет в моей сцене.
Однако все объекты очень сильно отражаются, а цвета искажаются.

введите описание изображения здесь

Как я могу получить отражение, похожее на этот пример:

введите описание изображения здесь

Я предполагаю, что выбираю неправильные значения для материалов?

Вот как я настраиваю свет и материалы:

void createLight() {

GLfloat mat_specular[] = {0.3, 0.3, 0.3, 1.0};
GLfloat mat_shininess[] = { 1.0 };
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);

// Lighting set up
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

// Set lighting intensity and color
GLfloat qaAmbientLight[]    = {0.2, 0.2, 0.2, 1.0};
GLfloat qaDiffuseLight[]    = {0.8, 0.8, 0.8, 1.0};
GLfloat qaSpecularLight[]   = {1.0, 1.0, 1.0, 1.0};
glLightfv(GL_LIGHT0, GL_DIFFUSE, qaDiffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, qaSpecularLight);

// Set the light position
GLfloat qaLightPosition[]   = {12, 8, 12, 0.4};
glLightfv(GL_LIGHT0, GL_POSITION, qaLightPosition);

}

1

Решение

Значения для света слишком высоки. Обратите внимание, что в стандартной модели источника света рассеянная и зеркальная части света суммируются.

Стандарт OpenGL Blinn-Фонг Модель света рассчитывается так:

Ka ... ambient material
Kd ... difusse material
Ks ... specular material

La ... ambient light
Ld ... diffuse light
Ls ... specular light
sh ... shininess

N  ... norlmal vector
L  ... light vector (from the vertex postion to the light)
V  ... view vector (from the vertex psotion to the eye)

Id    = max(dot(N, L), 0.0);

H     = normalize(V + L);
NdotH = max(dot(N, H), 0.0);
Is    = (sh + 2.0) * pow(NdotH, sh) / (2.0 * 3.14159265);

fs    = Ka*La + Id*Kd*Ld + Is*Ks*Ls;

Так как ваши зеркальные значения света инициализируются {1.0, 1.0, 1.0, 1.0};это может дать сумму, превышающую 1,0 в тех случаях, когда вектор нормали объекта указывает на свет. Это приводит к тому, что визуализированные объекты выглядят почти белыми.

Я рекомендую использовать небольшую часть внешнего освещения, потому что она добавляется ко всему объекту независимо от падающего света.

Используйте сильный рассеянный световой компонент, который хорошо отражает направление света.
Увидеть Как это подделка света работает на аэротвисте?

С компонентом зеркального света вы должны экспериментировать. Его эффект сильно зависит от параметра блеска. Но начните с использования небольшого значения для зеркального света и блеска около 10,0.

GLfloat mat_shininess[]   = {10.0};
GLfloat qaAmbientLight[]  = {0.2, 0.2, 0.2, 1.0};
GLfloat qaDiffuseLight[]  = {0.6, 0.6, 0.6, 1.0};
GLfloat qaSpecularLight[] = {0.3, 0.3, 0.3, 1.0};
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]