opengl光减少反射
opengl light reduce reflection
我正在尝试在我的场景中应用灯光。
然而,所有物体的反射都非常强烈,颜色也会失真。
如何获得类似于此示例的反射:
我假设我为材料选择了错误的值?
这是我设置灯光和材质的方式:
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);
}
灯光值过高。请注意,在标准光模型中,光的环境光、漫反射和镜面反射部分相加。
标准 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 的总和。这导致渲染的对象看起来几乎是白色的。
我推荐使用小的环境光部分,因为它独立于入射光添加到整个物体。
使用强朗伯漫射光分量,能很好地反射光的方向。
参见 How does this faking the light work on 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};
我正在尝试在我的场景中应用灯光。 然而,所有物体的反射都非常强烈,颜色也会失真。
如何获得类似于此示例的反射:
我假设我为材料选择了错误的值?
这是我设置灯光和材质的方式:
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);
}
灯光值过高。请注意,在标准光模型中,光的环境光、漫反射和镜面反射部分相加。
标准 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 的总和。这导致渲染的对象看起来几乎是白色的。
我推荐使用小的环境光部分,因为它独立于入射光添加到整个物体。
使用强朗伯漫射光分量,能很好地反射光的方向。
参见 How does this faking the light work on 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};