From e03792c2d5620ca07ac50717062df846927027c0 Mon Sep 17 00:00:00 2001 From: Patrick Schönberger Date: Wed, 10 Feb 2021 11:52:27 +0100 Subject: render shadowmap and irradiance --- shaders/fbo_frag.glsl | 48 ++++++++++++++++++++++++-------------------- shaders/frag.glsl | 32 ----------------------------- shaders/frag_irradiance.glsl | 34 +++++++++++++++++++++++++++++++ shaders/frag_shadowmap.glsl | 14 +++++++++++++ 4 files changed, 74 insertions(+), 54 deletions(-) delete mode 100644 shaders/frag.glsl create mode 100644 shaders/frag_irradiance.glsl create mode 100644 shaders/frag_shadowmap.glsl (limited to 'shaders') diff --git a/shaders/fbo_frag.glsl b/shaders/fbo_frag.glsl index f6f12cd..e199245 100644 --- a/shaders/fbo_frag.glsl +++ b/shaders/fbo_frag.glsl @@ -3,31 +3,35 @@ out vec4 FragColor; in vec2 TexCoords; -uniform sampler2D screenTexture; -uniform int applySSSSS; -uniform int N; +uniform sampler2D shadowmapTexture; +uniform sampler2D irradianceTexture; +uniform int screenWidth; +uniform int screenHeight; +uniform int renderState; +uniform vec2 samplePositions[13]; +uniform vec3 sampleWeights[13]; void main() { - if (applySSSSS == 1) { - float x = 1.0/1600.0; - float y = 1.0/900.0; - - float maxDist = N*N + N*N; - - vec4 color = vec4(0, 0, 0, 1); - for (int i = -N; i <= N; i++) { - for (int j = -N; j <= N; j++) { - float dist = i*i + j*j; - vec4 newC = texture(screenTexture, TexCoords + vec2(i*x, j*y)) / (2*N*N); - float factor = 1 - (dist / maxDist); - factor = pow(factor, 2); - color += newC * factor; - } - } - FragColor = color; + if (renderState == 0) { + FragColor = texture(shadowmapTexture, TexCoords); } - else { - FragColor = texture(screenTexture, TexCoords); + // stencil buffer + else if (renderState == 1 || texture(irradianceTexture, TexCoords).rgb == vec3(0, 0, 0)) { + FragColor = texture(irradianceTexture, TexCoords); + } + else if (renderState == 2) { + FragColor = texture(shadowmapTexture, TexCoords) * texture(irradianceTexture, TexCoords); + } + else if (renderState == 3) { + vec4 result = vec4(0, 0, 0, 1); + for (int i = 0; i < 13; i++) { + float oneX = 1.0/screenWidth; + float oneY = 1.0/screenHeight; + vec4 sample = texture(irradianceTexture, TexCoords + samplePositions[i] * vec2(oneX, oneY)); + vec4 weight = vec4(sampleWeights[i], 1); + result += sample * weight; + } + FragColor = result; } } diff --git a/shaders/frag.glsl b/shaders/frag.glsl deleted file mode 100644 index a70915a..0000000 --- a/shaders/frag.glsl +++ /dev/null @@ -1,32 +0,0 @@ -#version 330 core - -in vec3 FragPos; -in vec3 Normal; - -out vec4 FragColor; - -uniform vec3 objectColor; -uniform vec3 lightColor; -uniform vec3 lightPos; -uniform vec3 viewPos; - -void main() -{ - vec3 norm = normalize(Normal); - vec3 lightDir = normalize(lightPos - FragPos); - - float diff = max(dot(norm, lightDir), 0.0); - vec3 diffuse = diff * lightColor; - - float ambientStrength = 0.1; - vec3 ambient = ambientStrength * lightColor; - - float specularStrength = 0.5; - vec3 viewDir = normalize(viewPos - FragPos); - vec3 reflectDir = reflect(-lightDir, norm); - float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32); - vec3 specular = specularStrength * spec * lightColor; - - vec3 result = (ambient + diffuse + specular) * objectColor; - FragColor = vec4(result, 1.0f); -} diff --git a/shaders/frag_irradiance.glsl b/shaders/frag_irradiance.glsl new file mode 100644 index 0000000..9e14ebe --- /dev/null +++ b/shaders/frag_irradiance.glsl @@ -0,0 +1,34 @@ +#version 330 core + +in vec3 FragPos; +in vec3 Normal; + +out vec4 FragColor; + +uniform sampler2D shadowmapTexture; + +uniform vec3 objectColor; +uniform vec3 lightColor; +uniform vec3 lightPos; +uniform vec3 viewPos; + +void main() +{ + vec3 norm = normalize(Normal); + vec3 lightDir = normalize(lightPos - FragPos); + + float diff = max(dot(norm, lightDir), 0.0); + vec3 diffuse = diff * lightColor; + + float ambientStrength = 0.1; + vec3 ambient = ambientStrength * lightColor; + + float specularStrength = 0.5; + vec3 viewDir = normalize(viewPos - FragPos); + vec3 reflectDir = reflect(-lightDir, norm); + float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32); + vec3 specular = specularStrength * spec * lightColor; + + vec3 result = (ambient + diffuse + specular) * objectColor; + FragColor = vec4(result, 1.0f); +} diff --git a/shaders/frag_shadowmap.glsl b/shaders/frag_shadowmap.glsl new file mode 100644 index 0000000..6d6dab6 --- /dev/null +++ b/shaders/frag_shadowmap.glsl @@ -0,0 +1,14 @@ + +#version 330 core + +in vec3 FragPos; + +out vec4 FragColor; + +uniform vec3 lightPos; + +void main() +{ + float lightDist = 1 - (length(lightPos - FragPos) - 5.5); + FragColor = vec4(vec3(lightDist), 1); +} -- cgit v1.2.3