2016-11-12 1 views
1

diffuse onlyspecular onlydiffues plus specularКак вы можете добавить красный цвет в зеленый цвет и черным?

Вот моя вершинный шейдер:

#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;, треугольники становятся черными в случае ТОЛЬКО СПЕЦИАЛЬНОГО затенения. И вот мой вопрос: Как вы можете добавить красный в зеленый и черным? Почему, когда я добавляю Зеркальное освещение в цветах цветения Фонга, не добавляются правильно?

+1

Добавление изображений. Учтите, что мои фигуры вращаются вокруг оси Y. Благодаря! – Narek

ответ

0

Собачье дерьмо было глубоко выкопано. Я задал имя с именем Material.Shineness и использовал с именем Material.Shininess. Я настраивался из одной программы, но использовал в шейдере еще одну форму. Просто опечатка.

Извлеченный урок: OpenGL и GLSL работают совершенно неожиданно, когда вы делаете небольшую ошибку. Математика начинает не работать. Машина Тьюринга умирает. :)