2016-11-12 2 views
1

diffuse onlyspecular onlydiffues plus specularComment pouvez-vous ajouter la couleur rouge à la couleur verte et devenir noir?

Voici mon vertex shader:

#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); 
} 

Et voici le fragment:

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

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

Voici les coefficients d'intensité et réflexion de la lumière correspondant:

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; 

Lorsque LightIntensity = spec; je vois des triangles verts qui devraient être brillants et le reste des triangles sont noirs. Quand LightIntensity = diffuse; je vois très beau ombrage rouge diffus sur tous les triangles que la lumière tombe et reflète à la position de la caméra. Mais quand j'écris LightIntensity = /*ambient +*/ diffuse + spec; des triangles deviennent noirs est dans le cas de l'ombrage SEULEMENT SPECULAIRE. Et voici ma question: Comment pouvez-vous ajouter du rouge au vert et devenir noir ?? Pourquoi quand j'ajoute l'éclairage spéculaire dans les couleurs d'ombrage de Phong ne sont pas ajoutés correctement?

+1

Ajout d'images. Veuillez considérer que mes formes tournent autour de l'axe Y. Merci! – Narek

Répondre

0

La merde de chien a été creusée profondément. Je mettais le nom avec le nom Material.Shineness et en utilisant le nom Material.Shininess. Je mettais du programme un uniforme mais en utilisant un autre uniforme. Juste une faute de frappe.

Leçon apprise: OpenGL et GLSL fonctionnent de façon totalement inattendue lorsque vous commettez une erreur mineure. Math commence à ne pas fonctionner. La machine de Turing meurt. :)