2015-06-13 1 views
0

На моей осветительной сцене по какой-то причине окружающее освещение вообще не работает. Вся модель имеет одинаковую яркость, независимо от того, с каким видом она сталкивается. Я попытался избавиться от затухания, но он по-прежнему имеет те же результаты. Наряду с этим, зеркальное освещение всегда сияет, независимо от того, где находится камера. Он должен сиять, основываясь на позиции игрока. Вот скриншот проблемы с окружающей средой: Imgur.comОкружающая и зеркальная подсветка не работают правильно в GLSL

Как вы можете видеть, часть сферы, обращенная в сторону от света (расположена в [0.0,4.0,0.0]), имеет тот же цвет, что и часть лицом к свету. Предполагается, что окружающий фактор составляет 0,2 от цвета фрагмента.

Vertex источник шейдер:

layout(location = 0) in vec3 positions; 
layout(location = 1) in vec2 texCoords; 
layout(location = 2) in vec3 normals; 

out vec3 new_normal; 
out vec3 worldPos_out; 
out vec2 pass_texCoords; 

struct Matrices { 
    mat4 projection; 
    mat4 worldMatrix; 
    mat4 modelMatrix; 
    mat3 normalMatrix; 
}; 

uniform Matrices mat; 

void main(void) 
{ 
    pass_texCoords = texCoords; 

    vec4 newPosition = vec4(positions, 1); 

    vec4 worldPos = (mat.modelMatrix * newPosition); 
    mat4 Camera = mat.projection * mat.worldMatrix; 
    gl_Position = (Camera * worldPos); 

    new_normal = mat.normalMatrix * normals; 
    worldPos_out = worldPos.xyz; 
} 

Фрагмент Источник шейдер:

in vec3 new_normal; 
in vec3 worldPos_out; 
in vec2 pass_texCoords; 

out vec4 outColor; 
uniform vec3 viewPos; 

#define MAX_LIGHTS 50 

struct Material { 
    sampler2D diffuseMap; 
    sampler2D specularMap; 
    vec3 specular; 
    float shininess; 
}; 
uniform Material material; 

struct Light { 
    vec3 position; 
    vec3 color; 

    vec3 ambient; 
    vec3 diffuse; 
    vec3 specular; 

    float radius; 
}; 
uniform Light Lights[MAX_LIGHTS]; 
uniform int numLights; 

struct Math { 
    float constant; 
    float linear; 
    float quadratic; 
} math; 

vec3 applyPointLight(Light light, vec3 normal, vec3 fragPos, vec3 viewDir, vec3 surfaceColor, vec3 surfaceSpecular) { 
    vec3 lightDir = normalize(light.position - fragPos); 
    //Diffuse shading 
    float diff = max(dot(normal, lightDir), 0.0); 
    //Specular shading 
    vec3 reflectDir = reflect(-lightDir, normal); 
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); 
    //Attenuation 
    float distance = length(light.position - fragPos); 
    float attenuation = 5.0/(math.constant + math.linear * distance + 
         math.quadratic * (distance * distance)); 

    vec3 ambient = light.ambient * surfaceColor; 
    vec3 diffuse = light.diffuse * surfaceColor * light.color; 
    vec3 specular = light.specular * surfaceSpecular * light.color; 
    ambient *= attenuation; 
    diffuse *= attenuation; 
    specular *= attenuation; 

    return (ambient + diffuse + specular); 
} 

void main(void) { 
    vec3 surfaceColor = vec3(texture(material.diffuseMap, pass_texCoords)); 
    vec3 surfaceSpecular = vec3(texture(material.specularMap, pass_texCoords)); 

    vec3 unitNormal = normalize(new_normal); 
    vec3 viewDir = normalize(viewPos - worldPos_out); 

    math.constant = 1.0; 
    math.linear = 0.09; 
    math.quadratic = 0.032; 

    vec3 linearColor; 
    for(int i = 0; i < numLights; i++) 
     linearColor += applyPointLight(Lights[i], unitNormal, worldPos_out, viewDir, surfaceColor, surfaceSpecular); 

    float gamma = 2.2; 
    vec3 fragColor; 
    fragColor.rgb = pow(linearColor.rgb, vec3(1.0/gamma)); 

    outColor = vec4(linearColor, 1.0); 
} 

ответ

1

В вашей applyPointLight функции, вы не используете diff и spec переменные, которые предположительно свет в зависимости от изменения диффузно и зеркально. См., Если следующие работы:

vec3 diffuse = light.diffuse * surfaceColor * light.color * diff; 
vec3 specular = light.specular * surfaceSpecular * light.color * spec; 
Смежные вопросы