2023-01-12 15:00:14 -05:00
|
|
|
const float k = 1.8;
|
2024-05-04 21:08:24 -04:00
|
|
|
const float d0 = 0.04 + max(64.0 - shadowDistance, 0.0)/64.0 * 0.26;
|
2023-01-12 15:00:14 -05:00
|
|
|
const float d1 = 0.61;
|
|
|
|
float a = exp(d0);
|
|
|
|
float b = (exp(d1)-a)*150./128.0;
|
|
|
|
|
|
|
|
vec4 BiasShadowProjection(in vec4 projectedShadowSpacePosition) {
|
|
|
|
|
|
|
|
float distortFactor = log(length(projectedShadowSpacePosition.xy)*b+a)*k;
|
|
|
|
projectedShadowSpacePosition.xy /= distortFactor;
|
|
|
|
return projectedShadowSpacePosition;
|
|
|
|
}
|
|
|
|
|
|
|
|
float calcDistort(vec2 worldpos){
|
|
|
|
return 1.0/(log(length(worldpos)*b+a)*k);
|
|
|
|
}
|
2023-10-07 22:18:20 -04:00
|
|
|
|
|
|
|
uniform float far;
|
|
|
|
|
|
|
|
/*
|
|
|
|
mat4 BuildOrthoProjectionMatrix(const in float width, const in float height, const in float zNear, const in float zFar) {
|
|
|
|
return mat4(
|
|
|
|
vec4(2.0 / width, 0.0, 0.0, 0.0),
|
|
|
|
vec4(0.0, 2.0 / height, 0.0, 0.0),
|
|
|
|
vec4(0.0, 0.0, -2.0 / (zFar - zNear), 0.0),
|
|
|
|
vec4(0.0, 0.0, -(zFar + zNear)/(zFar - zNear), 1.0));
|
|
|
|
}
|
|
|
|
|
|
|
|
mat4 BuildTranslationMatrix(const in vec3 delta) {
|
|
|
|
return mat4(
|
|
|
|
vec4(1.0, 0.0, 0.0, 0.0),
|
|
|
|
vec4(0.0, 1.0, 0.0, 0.0),
|
|
|
|
vec4(0.0, 0.0, 1.0, 0.0),
|
|
|
|
vec4(delta, 1.0));
|
|
|
|
}
|
|
|
|
|
2023-10-14 23:34:52 -04:00
|
|
|
uniform vec3 CamPos;
|
2023-10-07 22:18:20 -04:00
|
|
|
|
2023-10-14 23:34:52 -04:00
|
|
|
// vec3 LightDir = vec3(1.0, 0.5, 1.0);
|
|
|
|
|
|
|
|
float rate = frameTimeCounter;
|
|
|
|
vec3 LightDir = vec3(sin(rate), 0.3, cos(rate));
|
|
|
|
// vec3 LightDir = vec3(cos(rate),sin(rate),cos(rate));
|
2023-10-07 22:18:20 -04:00
|
|
|
|
|
|
|
const float shadowIntervalSize = 2.0f;
|
|
|
|
vec3 GetShadowIntervalOffset() {
|
|
|
|
return fract(CamPos / shadowIntervalSize) * shadowIntervalSize - vec3(3,0,1);
|
|
|
|
}
|
|
|
|
|
|
|
|
mat4 BuildShadowViewMatrix(const in vec3 localLightDir) {
|
2023-10-14 23:34:52 -04:00
|
|
|
const vec3 worldUp = vec3(1, 0, 0);
|
|
|
|
|
|
|
|
vec3 zaxis = localLightDir;
|
|
|
|
|
|
|
|
// float check = localLightDir.y;
|
|
|
|
// if(check < 0.0) zaxis.y = -zaxis.y;
|
|
|
|
|
|
|
|
vec3 xaxis = normalize(cross(worldUp, zaxis));
|
|
|
|
vec3 yaxis = normalize(cross(zaxis, xaxis));
|
|
|
|
|
|
|
|
mat4 shadowModelViewEx = mat4(1.0);
|
|
|
|
shadowModelViewEx[0].xyz = vec3(xaxis.x, yaxis.x, zaxis.x);
|
|
|
|
shadowModelViewEx[1].xyz = vec3(xaxis.y, yaxis.y, zaxis.y);
|
|
|
|
shadowModelViewEx[2].xyz = vec3(xaxis.z, yaxis.z, zaxis.z);
|
|
|
|
|
|
|
|
vec3 intervalOffset = GetShadowIntervalOffset();
|
|
|
|
mat4 translation = BuildTranslationMatrix(intervalOffset);
|
|
|
|
|
|
|
|
return shadowModelViewEx * translation;
|
2023-10-07 22:18:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
mat4 BuildShadowProjectionMatrix() {
|
|
|
|
float maxDist = min(shadowDistance, far);
|
|
|
|
return BuildOrthoProjectionMatrix(maxDist, maxDist, -far, far);
|
|
|
|
}
|
2023-10-14 23:34:52 -04:00
|
|
|
|
|
|
|
// mat4 Custom_ViewMatrix = BuildShadowViewMatrix(LightDir);
|
|
|
|
// mat4 Custom_ProjectionMatrix = BuildShadowProjectionMatrix();
|
2023-10-07 22:18:20 -04:00
|
|
|
*/
|