DeferredCombine.fsh 2 KB
Newer Older
Dario Seyb's avatar
Dario Seyb committed
1
#version 330 core
Dario Seyb's avatar
Dario Seyb committed
2 3 4 5 6

uniform sampler2D uSamplerColor;
uniform sampler2D uSamplerNormal;
uniform sampler2D uSamplerDepth;

Dario Seyb's avatar
Dario Seyb committed
7 8
uniform sampler2D  uSamplerShadowMap;

Dario Seyb's avatar
Dario Seyb committed
9 10
uniform vec3 uLightPosition;
uniform vec4 uLightColor;
Dario Seyb's avatar
Dario Seyb committed
11
uniform mat4 uLightProjMatrix;
Dario Seyb's avatar
Dario Seyb committed
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

uniform float uNear;
uniform float uFar;

uniform mat4 uViewProjectionInverseMatrix;

in vec2 vTexCoord;
out vec4 oColor;

vec3 unpackNormal(vec4 norm) {
  return (norm.xyz * 2) - vec3(1, 1, 1);
}

float linearizeDepth(float depth) {
  return  (2.0 * uNear) / (uFar + uNear - depth * (uFar - uNear));  // convert to linear values
}

vec3 unpackWorldPosition(float depth) {
    vec4 clipSpaceLocation;
Dario Seyb's avatar
Dario Seyb committed
31 32 33
    clipSpaceLocation.xy = vTexCoord * 2.0 - 1.0;
    clipSpaceLocation.z = depth * 2.0 - 1.0;
    clipSpaceLocation.w = 1.0;
Dario Seyb's avatar
Dario Seyb committed
34 35 36 37
    vec4 homogenousLocation = uViewProjectionInverseMatrix * clipSpaceLocation;
    return homogenousLocation.xyz / homogenousLocation.w;
}

Dario Seyb's avatar
Dario Seyb committed
38 39 40 41 42 43 44 45 46 47 48 49
vec3 projShadowCoord(vec3 worldPosition) {
  vec4 shadowCoord =  uLightProjMatrix * vec4(worldPosition, 1); 
  vec3 clipShadowCoord = shadowCoord.xyz/shadowCoord.w;
  return clipShadowCoord;
}

float shadowFactor(vec3 worldPosition) {
  vec3 shadowCoord = projShadowCoord(worldPosition.xyz);
  float shadowDepth = texture(uSamplerShadowMap, shadowCoord.xy).r;
  return shadowDepth < shadowCoord.z -0.01 ? 0 : 1;
}

Dario Seyb's avatar
Dario Seyb committed
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
void main()
{
    vec4 color  = texture(uSamplerColor, vTexCoord);
    vec3 normal = unpackNormal(texture(uSamplerNormal, vTexCoord));
    
    float depth = texture(uSamplerDepth, vTexCoord).r;
    
    if(depth == 1) discard;
    
    vec3 worldPosition = unpackWorldPosition(depth);
    
    vec3 lightDir = uLightPosition - worldPosition;
    float lightDistance = length(lightDir);
    lightDir /= lightDistance;
    
Dario Seyb's avatar
Dario Seyb committed
65
    float diffuseFactor = dot(lightDir, normal) * uLightColor.a/(lightDistance*lightDistance) ;
Dario Seyb's avatar
Dario Seyb committed
66 67
    if(diffuseFactor < 0) diffuseFactor = 0;
    
Dario Seyb's avatar
Dario Seyb committed
68
    vec3 diffuseColor =  diffuseFactor * uLightColor.rgb * color.rgb * shadowFactor(worldPosition);;
Dario Seyb's avatar
Dario Seyb committed
69
    
Dario Seyb's avatar
Dario Seyb committed
70

Dario Seyb's avatar
Dario Seyb committed
71 72
    oColor = vec4(diffuseColor, 1);
}