我正在使用我自己的(不是内置的opengl)灯。这是我的片段着色器程序:
#version 330
in vec4 vertexPosition;
in vec3 surfaceNormal;
in vec2 textureCoordinate;
in vec3 eyeVecNormal;
out vec4 outputColor;
uniform sampler2D texture_diffuse;
uniform bool specular;
uniform float shininess;
struct Light {
vec4 position;
vec4 ambientColor;
vec4 diffuseColor;
vec4 specularColor;
};
uniform Light lights[8];
void main()
{
outputColor = texture2D(texture_diffuse, textureCoordinate);
for (int l = 0; l < 8; l++) {
vec3 lightDirection = normalize(lights[l].position.xyz - vertexPosition.xyz);
float diffuseLightIntensity = max(0, dot(surfaceNormal, lightDirection));
outputColor.rgb += lights[l].ambientColor.rgb * lights[l].ambientColor.a;
outputColor.rgb += lights[l].diffuseColor.rgb * lights[l].diffuseColor.a * diffuseLightIntensity;
if (specular) {
vec3 reflectionDirection = normalize(reflect(lightDirection, surfaceNormal));
float specular = max(0.0, dot(eyeVecNormal, reflectionDirection));
if (diffuseLightIntensity != 0) {
vec3 specularColorOut = pow(specular, shininess) * lights[l].specularColor.rgb;
outputColor.rgb += specularColorOut * lights[l].specularColor.a;
}
}
}
}
现在的问题是,当我有2个光源,说环境色vec4(0.2f, 0.2f, 0.2f, 1.0f)
时,模型上的环境颜色将是vec4(0.4f, 0.4f, 0.4f, 1.0f)
因为我只是将它添加到outputColor变量。 如何为多个灯光计算单个环境光和单个漫反射颜色变量,这样我会得到一个真实的结果?
答案 0 :(得分:12)
这是一个有趣的事实:现实世界中的灯光没有环境色,漫反射色或镜面色。它们发出一种颜色。期间(好的,如果你想要技术性的,灯会发出很多的颜色。但是单个光子没有“环境”属性。它们只有不同的波长)。你所做的就是复制那些复制OpenGL无意义的关于环境和漫反射光色的人。
停止复制其他人的代码并执行正确。
每盏灯都有一种颜色。您可以使用该颜色计算该光对对象的漫反射和镜面反射贡献。就是这样。
Ambient是场景的属性,而不是任何特定光源。它旨在表示indirect, global illumination:从场景中的其他对象反射的光,作为一般聚合。你没有环境“灯”;只有一个环境术语,应该应用一次。