2013-11-18 7 views
0

У меня очень странное поведение зеркальной (светлой модели света). Похоже, что они обходятся с обеих сторон от всех объектов. Кто-нибудь знает, в чем проблема? Фактическое вычисление, похоже, в порядке, так как я вижу, что свет меняет свое положение, когда объект вращается.Зеркальный свет появляется с обеих сторон.

#version 330 

in vec4 CameraPos0; 
in vec3 Pos0; 
in vec4 Colour0; 
in vec3 Normal0; 

out vec4 FragColor; 

// Ambient light parameters 
uniform vec3 gAmbientLightIntensity; 

// Directional light parameters 
uniform vec3 gDirectionalLightIntensity; 
uniform vec3 gDirectionalLightDirection; 

// Specular light parameter 
uniform vec3 gSpecularLightIntensity; 
uniform vec3 gLightSourcePosition; 
uniform vec3 gCameraPosition; 

// Material constants 
uniform float gKa; 
uniform float gKd; 
uniform float gKs; 

void main() 
{ 

    // Calculate the ambient light intensity at the vertex 
    // Ia = Ka * ambientLightIntensity 
    vec4 ambientLightIntensity = gKa * vec4(gAmbientLightIntensity, 1.0); 

    // Setup the light direction and normalise it 
    vec3 lightDirection = normalize(-gDirectionalLightDirection); 

    //lightDirection = normalize(gDirectionalLightDirection); 
    // Id = kd * lightItensity * N.L 
    // Calculate N.L 
    float diffuseFactor = dot(Normal0, lightDirection); 
    diffuseFactor = clamp(diffuseFactor, 0.0, 1.0); 
    // N.L * light source colour * intensity 
    vec4 diffuseLightIntensity = gKd * vec4(gDirectionalLightIntensity, 1.0f) * diffuseFactor; 

    // Phong light 
    vec3 L = normalize(gLightSourcePosition - Pos0); 
    vec3 V = normalize(-Pos0); 
    vec3 R = normalize(2 * Normal0 * dot(Normal0, L) - L); 

    float specularFactor = pow(dot(R, V), 0.1f); 
    vec4 specularLightIntensity = gKs * vec4(gSpecularLightIntensity, 1.0f) * specularFactor; 
    specularLightIntensity = clamp(specularLightIntensity, 0.0, 1.0); 

    // Final vertex colour is the product of the vertex colour 
    // and the total light intensity at the vertex 
    vec4 lightedFragColor = Colour0 * (ambientLightIntensity + diffuseLightIntensity + specularLightIntensity); 

    FragColor = lightedFragColor; 
} 

Vertex Shader

#version 330 

layout (location = 0) in vec3 Position; 
layout (location = 1) in vec3 Normal; 
layout (location = 2) in vec4 Colour; 

out vec3 Pos0; 
out vec4 Colour0; 
out vec3 Normal0; 
out vec4 CameraPos0; 

uniform mat4 gModelToWorldTransform; 
uniform mat4 gWorldToViewTransform; 
uniform mat4 gProjectionTransform; 

void main() 
{ 
    vec4 vertexPositionInModelSpace = vec4(Position, 1); 
    vec4 vertexInWorldSpace = gModelToWorldTransform * vertexPositionInModelSpace; 
    vec4 vertexInViewSpace = gWorldToViewTransform * vertexInWorldSpace; 
    vec4 vertexInHomogeneousClipSpace = gProjectionTransform * vertexInViewSpace; 
    gl_Position = vertexInHomogeneousClipSpace; 

    vec3 normalInWorldSpace = (gModelToWorldTransform * vec4(Normal, 0.0)).xyz; 
    normalInWorldSpace = normalize(normalInWorldSpace); 

    Normal0 = normalInWorldSpace; 
    CameraPos0 = vertexInViewSpace; 
    Pos0 = vertexInWorldSpace.xyz; 
    Colour0 = Colour; 
} 

enter image description here

+0

Вы подаете любую операцию кроме вращения в вашем объекте-> мировой матрицы? Если это так, то вы не должны использовать *** эту *** матрицу для преобразования ваших нормалей. –

ответ

0

вам нужно clamp в dot результат исчисления насыщения, потому что на обратной стороне результат отрицательный и pow может вернуть положительное вместо того, чтобы зажимать его до нуля.

float specularFactor = pow(clamp(dot(R, V),0.0,1.0), 0.1f);

Edit:

Также V должен быть вектор, указывающий на положение камеры, а не в положение вершины в мировом пространстве:

vec3 V = normalize(CameraPos0 - Pos0);

+0

К сожалению, это не помогло. Еще одна проблема. – tvoloshyn

+0

@voltar, проверьте правку. – Raxvan

+0

тоже не помогло. Я думаю, что может быть что-то не так и в вершинном шейдере, потому что я не уверен, что именно мне нужно для Pos0 и CamerPos0. Это в мировом пространстве или в пространстве модели? – tvoloshyn

 Смежные вопросы

  • Нет связанных вопросов^_^