GLSL计算来自多个灯的颜色矢量

Qua*_*hey 6 opengl glsl

我正在使用自己的(不是内置的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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在问题是,当我有2个具有环境颜色vec4(0.2f, 0.2f, 0.2f, 1.0f)的光源时,模型上的环境颜色将是vec4(0.4f, 0.4f, 0.4f, 1.0f)因为我只是将它添加到outputColor变量.如何为多个灯计算单个环境和单个漫反射颜色变量,这样我会得到一个真实的结果?

Nic*_*las 12

这是一个有趣的事实:现实世界中的灯光没有环境光,漫反射或镜面反射颜色.它们发出一种颜色.期间(好吧,如果你想要技术性,灯会发出很多颜色.但是单个光子没有"环境"特性.它们只有不同的波长).你所做的就是复制那些复制OpenGL无意义的环境和漫反射光色的人.

停止复制别人的代码并正确执行.

每种灯都有一种颜色.您可以使用该颜色计算该光对对象的漫反射和镜面反射贡献.而已.

环境是场景的属性,而不是任何特定的光.它旨在表示间接的全局照明:从场景中的其他对象反射的光,作为一般聚合.你没有环境"灯"; 只有一个环境术语,应该应用一次.

  • :DD我喜欢你的答案! (2认同)