你怎么能把红色加到绿色上然后变成黑色呢?

How can you add red color to green color and get black?

这是我的顶点着色器:

#version 400

layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexNormal;

out vec3 LightIntensity;

struct LightInfo {
    vec3 Position; // Light position in eye coords.
    vec3 La; // Ambient light intensity
    vec3 Ld; // Diffuse light intensity
    vec3 Ls; // Specular light intensity
};

uniform LightInfo Light;

struct MaterialInfo {
    vec3 Ka; // Ambient reflectivity
    vec3 Kd; // Diffuse reflectivity
    vec3 Ks; // Specular reflectivity
    float Shininess; // Specular shininess factor
};

uniform MaterialInfo Material;

uniform mat4 ModelViewMatrix;
uniform mat3 NormalMatrix;
uniform mat4 ProjectionMatrix;
uniform mat4 MVP;

void main()
{



    mat4 normalMatrixBetter = transpose(inverse(ModelViewMatrix));
    vec3 normalEyeSpace = normalize(vec3(normalMatrixBetter * vec4(VertexNormal, 0.0)));

    //vec3 tnorm = normalize(normalMatrixBetter * VertexNormal);

    vec4 vertexPositionInEyeCoords = ModelViewMatrix * vec4(VertexPosition, 1.0);
    vec3 s = normalize(vec3(Light.Position.xyz - vertexPositionInEyeCoords.xyz));

    vec3 v = normalize(-vertexPositionInEyeCoords.xyz);
    vec3 r = reflect(-s, normalEyeSpace);

    vec3 ambient = Light.La * Material.Ka;

    float sDotN = max(dot(s, normalEyeSpace), 0.0);
    vec3 diffuse = Light.Ld * Material.Kd * sDotN;

    vec3 spec = vec3(0.0);
    if (sDotN > 0.0)
    {
        spec = Light.Ls * Material.Ks * pow(max(dot(r, v), 0.0), Material.Shininess);
    }


//  LightIntensity = ambient;
//  LightIntensity = diffuse;
//  LightIntensity = spec;
//  LightIntensity = ambient + diffuse;
    LightIntensity = /*ambient +*/ diffuse + spec;


    gl_Position = MVP * vec4(VertexPosition, 1.0);
}

这是片段:

#version 400 
in vec3 LightIntensity; 
layout( location = 0) out vec4 FragColor; 

void main() 
{
    FragColor = vec4(LightIntensity, 1.0) * 0.3;
}

对应的光照强度和反射率系数如下:

vec3 lightSourceAmbientIntensity(1.0f, 1.0f, 1.0f);     // La, Light source ambient intensity
vec3 lightSourceDiffuseIntensity(10.0f, 10.0f, 10.0f);     // Ld, Light source diffuse intensity
vec3 lightSourceSpecularIntensity(1.0f, 1.0f, 1.0f);    // Ls, Light source specular intensity

vec3 ambientReflectivity(0.5f, 0.0f, 0.0f);         // Ka, 
vec3 diffuseReflectivity(1.0f, 0.0f, 0.0f);         // Kd,
vec3 specularReflectivity(0.0f, 0.9f, 0.0f);        // Ks,

GLfloat materialShineness = 1.0f;

LightIntensity = spec;我看到绿色的三角形应该是闪亮的,其余的三角形是黑色的。当 LightIntensity = diffuse; 时,我在光线照射并反射到相机位置的所有三角形上看到非常漂亮的漫反射红色阴影。但是当我写 LightIntensity = /*ambient +*/ diffuse + spec; 三角形变黑是在只有镜面阴影的情况下。这是我的问题:如何将红色添加到绿色并变成黑色?? 为什么当我在 Phong 着色中添加镜面照明时颜色没有正确添加?

狗屎挖得很深。我正在使用 Material.Shineness 名称设置名称并使用 Material.Shininess 名称。我是从程序中设置一个制服,但在着色器中使用另一个制服。只是一个错字。

经验教训:当您犯了一个小错误时,OpenGL 和 GLSL 的工作完全出乎意料。数学开始不起作用。图灵机死了。 :)