Solara-Shaders/shaders/lib/reflections/roughReflections.glsl
2024-06-22 15:15:55 -04:00

67 lines
1.8 KiB
GLSL

#ifdef REFLECTION_PREVIOUS
#define colortexR colortex5
#else
#define colortexR colortex0
#endif
vec4 RoughReflection(vec3 viewPos, vec3 normal, float dither, float smoothness) {
vec4 color = vec4(0.0);
float border = 0.0;
vec4 pos = Raytrace(depthtex0, viewPos, normal, dither, border, 6, 0.5, 0.1, 1.8);
border = clamp(13.333 * (1.0 - border) * (0.9 * smoothness + 0.1), 0.0, 1.0);
float fovScale = gbufferProjection[1][1] / 1.37;
if (pos.z < 1.0 - 1e-5) {
#ifdef REFLECTION_ROUGH
float dist = 0.03125 * pow(1.0 - smoothness, 2.0) * pos.a * fovScale;
float lod = log2(viewHeight * dist);
#else
float lod = 0.0;
#endif
if (lod < 1.0) {
color.a = texture2DLod(colortex6, pos.st, 1.0).b;
if (color.a > 0.001) color.rgb = texture2DLod(colortexR, pos.st, 1.0).rgb;
#ifdef REFLECTION_PREVIOUS
color.rgb = pow(color.rgb * 2.0, vec3(8.0));
#else
#if ALPHA_BLEND == 0
color.rgb = pow(color.rgb, vec3(2.2));
#endif
#endif
}else{
for(int i = -2; i <= 2; i++) {
for(int j = -2; j <= 2; j++) {
vec2 refOffset = vec2(i, j) * exp2(lod - 1.0) / vec2(viewWidth, viewHeight);
vec2 refCoord = pos.st + refOffset;
float alpha = texture2DLod(colortex6, refCoord, lod).b;
if (alpha > 0.001) {
vec3 ssrSample = texture2DLod(colortexR, refCoord, max(lod - 1.0, 0.0)).rgb;
#ifdef REFLECTION_PREVIOUS
ssrSample = pow(ssrSample * 2.0, vec3(8.0));
#else
#if ALPHA_BLEND == 0
ssrSample = pow(ssrSample, vec3(2.2));
#endif
#endif
color.rgb += ssrSample;
color.a += alpha;
}
}
}
color /= 25.0;
}
//Fog(color.rgb, (gbufferProjectionInverse * pos).xyz);
color *= color.a;
color.a = clamp(color.a * 2.0 - 1.0, 0.0, 1.0) * border;
// color.a = pos.a * float(border > 0.0);
}
return color;
}