Files
Gregtech-New-Bastards/.minecraft/shaderpacks/ComplementaryShaders_v4.6/shaders/lib/reflections/raytrace.glsl
2025-09-13 16:11:10 +02:00

51 lines
1.3 KiB
GLSL

vec3 nvec3(vec4 pos) {
return pos.xyz/pos.w;
}
vec4 nvec4(vec3 pos) {
return vec4(pos.xyz, 1.0);
}
float cdist(vec2 coord) {
return max(abs(coord.s-0.5) * 1.95, abs(coord.t-0.5) * 2.0);
}
vec4 Raytrace(sampler2D depthtex, vec3 viewPos, vec3 normal, float dither) {
vec3 pos = vec3(0.0);
float dist = 0.0;
#if AA > 1
dither = fract(dither + frameTimeCounter);
#endif
vec3 start = viewPos;
vec3 vector = reflect(normalize(viewPos), normalize(normal));
viewPos += vector;
vec3 tvector = vector;
int sr = 0;
for(int i = 0; i < 30; i++) {
pos = nvec3(gbufferProjection * nvec4(viewPos)) * 0.5 + 0.5;
if (pos.x < -0.05 || pos.x > 1.05 || pos.y < -0.05 || pos.y > 1.05) break;
vec3 rfragpos = vec3(pos.xy, texture2D(depthtex,pos.xy).r);
rfragpos = nvec3(gbufferProjectionInverse * nvec4(rfragpos * 2.0 - 1.0));
dist = length(start - rfragpos);
float err = length(viewPos - rfragpos);
float lVector = length(vector);
if (lVector > 1.0) lVector = pow(lVector, 1.14);
if (err < lVector) {
sr++;
if(sr >= 6) break;
tvector -= vector;
vector *= 0.1;
}
vector *= 2.0;
tvector += vector * (dither * 0.05 + 1.0);
viewPos = start + tvector;
}
return vec4(pos, dist);
}