80 lines
2.7 KiB
GLSL
80 lines
2.7 KiB
GLSL
#version 450
|
|
|
|
layout (location = 0) in vec3 vertexViewSpacePosition;
|
|
layout (location = 1) in vec2 vertexTexCoords;
|
|
|
|
layout (location = 0) out vec4 fragLight;
|
|
|
|
layout (binding = 0) uniform sampler2D albedo; ///< g-buffer colors
|
|
layout (binding = 1) uniform sampler2D worldSpacePositionMap; ///< vertex position in world-space
|
|
layout (binding = 2) uniform sampler2D viewSpacePositionMap; ///< vertex position in view-space
|
|
layout (binding = 3) uniform sampler2D normalMap; ///< vertex normal in view-space
|
|
layout (binding = 4) uniform sampler2DShadow shadowMap; ///< shadow map
|
|
|
|
uniform mat4 viewMatrix; // From world-space to camera view-space
|
|
uniform mat4 shadowMatrix; // From world-space to shadowCamera view-space
|
|
|
|
uniform vec3 light_color;
|
|
uniform float light_intensity;
|
|
uniform vec3 light_direction;
|
|
|
|
vec3 directionalLightADS(vec3 viewSpaceDirection,
|
|
vec3 viewSpaceNormal,
|
|
vec3 viewSpaceObjectPosition,
|
|
vec3 color,
|
|
float intensity)
|
|
{
|
|
// Lighting
|
|
float Li = intensity;
|
|
vec3 Ka = vec3(0.2);
|
|
vec3 Kd = color;
|
|
vec3 Ks = vec3(0.5);
|
|
float shininess = 10;
|
|
|
|
vec3 n = viewSpaceNormal;
|
|
vec3 s = viewSpaceDirection;
|
|
vec3 v = normalize(-vec3(viewSpaceObjectPosition));
|
|
vec3 h = normalize(v + s);
|
|
|
|
vec3 pixelLight = vec3((0.2) + Li) *
|
|
((Kd) * max(dot(s, n), 0.0) +
|
|
(Ks) * pow(max(dot(h, n), 0.0), shininess));
|
|
// Final color
|
|
return pixelLight;
|
|
}
|
|
|
|
vec4 getShadow(vec3 a, vec3 ds)
|
|
{
|
|
vec4 wp = texture(worldSpacePositionMap, vertexTexCoords);
|
|
vec4 shadowCoord = shadowMatrix * wp;
|
|
|
|
float visibility = 1.0;
|
|
if(shadowCoord.z >= 0 ) {
|
|
// vec4 normalTexel = texture(normalMap, vertexTexCoords);
|
|
// float bias = max(0.05 * (1.0 - dot(normalTexel.xyz, light_direction)), 0.005);
|
|
// visibility = textureProj(shadowMap, vec4(shadowCoord.xy, shadowCoord.z-bias, shadowCoord.w), bias);
|
|
// shadowCoord.z -= bias;
|
|
visibility = textureProj(shadowMap, shadowCoord);
|
|
}
|
|
|
|
return vec4(a + ds * visibility, 1.0);
|
|
}
|
|
|
|
void main()
|
|
{
|
|
// Get texels
|
|
vec4 positionTexel = texture(viewSpacePositionMap, vertexTexCoords);
|
|
vec4 normalTexel = texture(normalMap, vertexTexCoords);
|
|
|
|
// Lighting calc
|
|
vec3 a = vec3(0.2);
|
|
vec3 ds = directionalLightADS(normalize(viewMatrix * vec4(light_direction, 0)).xyz,
|
|
normalTexel.xyz,
|
|
positionTexel.xyz,
|
|
light_color,
|
|
light_intensity);
|
|
|
|
fragLight = vec4(a + ds, 1);//getShadow(a, ds);
|
|
// fragLight = getShadow(a, ds);
|
|
}
|