spooky-game/assets/shaders/directional-light-fragment....

80 lines
2.7 KiB
Plaintext
Raw Permalink Normal View History

2020-08-13 20:14:37 +02:00
#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);
}