mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-26 18:21:04 +00:00
Shadow mapping render pass (#11244)
Co-authored-by: x2048 <codeforsmile@gmail.com>
This commit is contained in:
parent
46f42e15c4
commit
c47313db65
35 changed files with 2624 additions and 38 deletions
13
client/shaders/shadow_shaders/pass1_fragment.glsl
Normal file
13
client/shaders/shadow_shaders/pass1_fragment.glsl
Normal file
|
@ -0,0 +1,13 @@
|
|||
uniform sampler2D ColorMapSampler;
|
||||
varying vec4 tPos;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 col = texture2D(ColorMapSampler, gl_TexCoord[0].st);
|
||||
|
||||
if (col.a < 0.70)
|
||||
discard;
|
||||
|
||||
float depth = 0.5 + tPos.z * 0.5;
|
||||
gl_FragColor = vec4(depth, 0.0, 0.0, 1.0);
|
||||
}
|
38
client/shaders/shadow_shaders/pass1_trans_fragment.glsl
Normal file
38
client/shaders/shadow_shaders/pass1_trans_fragment.glsl
Normal file
|
@ -0,0 +1,38 @@
|
|||
uniform sampler2D ColorMapSampler;
|
||||
varying vec4 tPos;
|
||||
|
||||
#ifdef COLORED_SHADOWS
|
||||
// c_precision of 128 fits within 7 base-10 digits
|
||||
const float c_precision = 128.0;
|
||||
const float c_precisionp1 = c_precision + 1.0;
|
||||
|
||||
float packColor(vec3 color)
|
||||
{
|
||||
return floor(color.b * c_precision + 0.5)
|
||||
+ floor(color.g * c_precision + 0.5) * c_precisionp1
|
||||
+ floor(color.r * c_precision + 0.5) * c_precisionp1 * c_precisionp1;
|
||||
}
|
||||
|
||||
const vec3 black = vec3(0.0);
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 col = texture2D(ColorMapSampler, gl_TexCoord[0].st);
|
||||
#ifndef COLORED_SHADOWS
|
||||
if (col.a < 0.5)
|
||||
discard;
|
||||
#endif
|
||||
|
||||
float depth = 0.5 + tPos.z * 0.5;
|
||||
// ToDo: Liso: Apply movement on waving plants
|
||||
// depth in [0, 1] for texture
|
||||
|
||||
//col.rgb = col.a == 1.0 ? vec3(1.0) : col.rgb;
|
||||
#ifdef COLORED_SHADOWS
|
||||
float packedColor = packColor(mix(col.rgb, black, col.a));
|
||||
gl_FragColor = vec4(depth, packedColor, 0.0,1.0);
|
||||
#else
|
||||
gl_FragColor = vec4(depth, 0.0, 0.0, 1.0);
|
||||
#endif
|
||||
}
|
26
client/shaders/shadow_shaders/pass1_trans_vertex.glsl
Normal file
26
client/shaders/shadow_shaders/pass1_trans_vertex.glsl
Normal file
|
@ -0,0 +1,26 @@
|
|||
uniform mat4 LightMVP; // world matrix
|
||||
varying vec4 tPos;
|
||||
|
||||
const float bias0 = 0.9;
|
||||
const float zPersFactor = 0.5;
|
||||
const float bias1 = 1.0 - bias0 + 1e-6;
|
||||
|
||||
vec4 getPerspectiveFactor(in vec4 shadowPosition)
|
||||
{
|
||||
float pDistance = length(shadowPosition.xy);
|
||||
float pFactor = pDistance * bias0 + bias1;
|
||||
shadowPosition.xyz *= vec3(vec2(1.0 / pFactor), zPersFactor);
|
||||
|
||||
return shadowPosition;
|
||||
}
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 pos = LightMVP * gl_Vertex;
|
||||
|
||||
tPos = getPerspectiveFactor(LightMVP * gl_Vertex);
|
||||
|
||||
gl_Position = vec4(tPos.xyz, 1.0);
|
||||
gl_TexCoord[0].st = gl_MultiTexCoord0.st;
|
||||
}
|
26
client/shaders/shadow_shaders/pass1_vertex.glsl
Normal file
26
client/shaders/shadow_shaders/pass1_vertex.glsl
Normal file
|
@ -0,0 +1,26 @@
|
|||
uniform mat4 LightMVP; // world matrix
|
||||
varying vec4 tPos;
|
||||
|
||||
const float bias0 = 0.9;
|
||||
const float zPersFactor = 0.5;
|
||||
const float bias1 = 1.0 - bias0 + 1e-6;
|
||||
|
||||
vec4 getPerspectiveFactor(in vec4 shadowPosition)
|
||||
{
|
||||
float pDistance = length(shadowPosition.xy);
|
||||
float pFactor = pDistance * bias0 + bias1;
|
||||
shadowPosition.xyz *= vec3(vec2(1.0 / pFactor), zPersFactor);
|
||||
|
||||
return shadowPosition;
|
||||
}
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 pos = LightMVP * gl_Vertex;
|
||||
|
||||
tPos = getPerspectiveFactor(pos);
|
||||
|
||||
gl_Position = vec4(tPos.xyz, 1.0);
|
||||
gl_TexCoord[0].st = gl_MultiTexCoord0.st;
|
||||
}
|
23
client/shaders/shadow_shaders/pass2_fragment.glsl
Normal file
23
client/shaders/shadow_shaders/pass2_fragment.glsl
Normal file
|
@ -0,0 +1,23 @@
|
|||
uniform sampler2D ShadowMapClientMap;
|
||||
#ifdef COLORED_SHADOWS
|
||||
uniform sampler2D ShadowMapClientMapTraslucent;
|
||||
#endif
|
||||
uniform sampler2D ShadowMapSamplerdynamic;
|
||||
|
||||
void main() {
|
||||
|
||||
#ifdef COLORED_SHADOWS
|
||||
vec2 first_depth = texture2D(ShadowMapClientMap, gl_TexCoord[0].st).rg;
|
||||
vec2 depth_splitdynamics = vec2(texture2D(ShadowMapSamplerdynamic, gl_TexCoord[2].st).r, 0.0);
|
||||
if (first_depth.r > depth_splitdynamics.r)
|
||||
first_depth = depth_splitdynamics;
|
||||
vec2 depth_color = texture2D(ShadowMapClientMapTraslucent, gl_TexCoord[1].st).rg;
|
||||
gl_FragColor = vec4(first_depth.r, first_depth.g, depth_color.r, depth_color.g);
|
||||
#else
|
||||
float first_depth = texture2D(ShadowMapClientMap, gl_TexCoord[0].st).r;
|
||||
float depth_splitdynamics = texture2D(ShadowMapSamplerdynamic, gl_TexCoord[2].st).r;
|
||||
first_depth = min(first_depth, depth_splitdynamics);
|
||||
gl_FragColor = vec4(first_depth, 0.0, 0.0, 1.0);
|
||||
#endif
|
||||
|
||||
}
|
9
client/shaders/shadow_shaders/pass2_vertex.glsl
Normal file
9
client/shaders/shadow_shaders/pass2_vertex.glsl
Normal file
|
@ -0,0 +1,9 @@
|
|||
|
||||
void main()
|
||||
{
|
||||
vec4 uv = vec4(gl_Vertex.xyz, 1.0) * 0.5 + 0.5;
|
||||
gl_TexCoord[0] = uv;
|
||||
gl_TexCoord[1] = uv;
|
||||
gl_TexCoord[2] = uv;
|
||||
gl_Position = vec4(gl_Vertex.xyz, 1.0);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue