OpenGL свет уменьшить отражение - PullRequest
0 голосов
/ 17 мая 2018

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

enter image description here

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

enter image description here

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

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

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 Ответ

0 голосов
/ 17 мая 2018

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

Стандартная модель OpenGL Blinn-Phong рассчитывается следующим образом:

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};
...