GLSL OpenGL每增加一盏灯都会变得更暗

GLSL OpenGL每增加一盏灯都会变得更暗,opengl,glsl,opengl-3,lighting,Opengl,Glsl,Opengl 3,Lighting,我有一个场景,一盏灯就可以完美地工作。然而,当我再添加两个时,每一个新的添加都会变暗,直到几乎看不见为止。衰减系数是错误的还是其他原因 int i = 0; for(i=0; i<3; i++){ if (lights[i].enabled == 1.0){ //Lighting Attributes vec4 light_position = vec4(lights[i].position,1.0);

我有一个场景,一盏灯就可以完美地工作。然而,当我再添加两个时,每一个新的添加都会变暗,直到几乎看不见为止。衰减系数是错误的还是其他原因

    int i = 0;
    for(i=0; i<3; i++){
        if (lights[i].enabled == 1.0){
            //Lighting Attributes
            vec4  light_position    = vec4(lights[i].position,1.0);
            vec4  light_ambient     = lights[i].ambient;
            vec4  light_diffuse     = lights[i].diffuse;
            vec4  light_specular    = lights[i].specular;

            float light_att_constant  = 1.0;
            float light_att_linear    = 0.0;
            float light_att_quadratic = 0.01;
            float light_shine         = 1.0;

            //Object Attributes
            vec3  obj_position      = n_vertex;
            vec3  obj_normals       = n_normal;
            vec4  obj_color         = n_colors;

            //Calc Distance
            vec3  distance_LO       = (obj_position - light_position.xyz);
            float distance          = length(distance_LO);

            //Normalize some attributes
            vec3  n_light_position  = normalize(distance_LO);

            //Apply ambience
            finalColor              *= light_ambient * global_ambient;

            //Calc Cosine of Normal and Light
            float NdotL             = max(dot(obj_normals, n_light_position),0.0);

            //Calc Eye Vector (negated position)
            vec3  eye_view          = -obj_position;

            //Check if Surface is facing the Light
            if (NdotL > 0){
                //Apply lambertian reflection
                finalColor += obj_color * light_diffuse * NdotL;

                //Calc the half-vector
                vec3 half_vector = normalize(light_position.xyz + eye_view);

                //Calc angle between normal and half-vector
                //See the engine notebook for a diagram.
                float NdotHV = max(dot(obj_normals, half_vector), 0.0);

                //Apply Specularity
                finalColor += obj_color * light_specular * pow(NdotHV, light_shine);
            }

            //Calc Attenuation
            float attenuation = light_att_constant / ((1 + light_att_linear * distance) *
                                1 + light_att_quadratic * distance * distance);

            //Apply Attenuation
            finalColor = finalColor * attenuation;
        }
    }

    color = vec4(finalColor.rgb, 1.0);

你的色彩倍增。这意味着阴影将变得更暗

如果你在某个相对亮度的1/2周围有一个区域,那么你将它乘以该灯光的1/2贡献,你将得到1/4

如果你有Photoshop或Gimp,你可以自己用倍增混合模式测试,三个圆圈,纯红色,纯绿色和纯蓝色,然后重叠。比较Photoshop中的乘法和线性减淡加号操作

这里有一个例子


你肯定会想要一种加法效果,也就是说,把这些术语加在一起。

你可以将颜色乘以。这意味着阴影将变得更暗

如果你在某个相对亮度的1/2周围有一个区域,那么你将它乘以该灯光的1/2贡献,你将得到1/4

如果你有Photoshop或Gimp,你可以自己用倍增混合模式测试,三个圆圈,纯红色,纯绿色和纯蓝色,然后重叠。比较Photoshop中的乘法和线性减淡加号操作

这里有一个例子

你肯定会想要一个加法效果,也就是说,把术语加在一起