1

我正在尝试在我的场景中应用灯光。然而,所有物体都在极度反射,颜色变得扭曲。

在此处输入图像描述

如何获得类似于此示例的反射:

在此处输入图像描述

我假设我为材料选择了错误的值?

这就是我设置灯光和材质的方式:

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);

}
4

1 回答 1

3

光的值太高了。请注意,在标准光模型中,光的环境、漫反射和镜面反射部分是相加的。

标准的 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 的总和。这导致渲染的对象看起来几乎是白色的。

我建议使用一个小的环境光部分,因为它独立于入射光添加到整个物体。

使用强朗伯漫反射光组件,可以很好地反射光线的方向。
看看这个假光如何在 aerotwist 上起作用?

对于镜面反射光组件,您必须进行实验。它的效果很大程度上取决于光泽度参数。但是首先使用一个小的镜面光值和大约 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};
于 2018-05-17T14:46:56.967 回答