This commit is contained in:
2026-02-24 11:44:01 -08:00
parent c9839c9be6
commit 1c3c30e6ce
34 changed files with 1629 additions and 1271 deletions

View File

@ -5,42 +5,56 @@
uniform sampler2D tex;
uniform sampler2D gbuffer0;
uniform sampler2D gbufferD;
uniform vec2 dirInv; // texStep
in vec2 texCoord;
out float fragColor;
out vec3 fragColor;
const float blurWeights[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216);
// const float blurWeights[10] = float[] (0.132572, 0.125472, 0.106373, 0.08078, 0.05495, 0.033482, 0.018275, 0.008934, 0.003912, 0.001535);
const float discardThreshold = 0.95;
float doBlur(const float blurWeight, const int pos, const vec3 nor, const vec2 texCoord) {
const float posadd = pos + 0.5;
vec3 nor2 = getNor(textureLod(gbuffer0, texCoord + pos * dirInv, 0.0).rg);
float influenceFactor = step(discardThreshold, dot(nor2, nor));
float col = textureLod(tex, texCoord + posadd * dirInv, 0.0).r;
fragColor += col * blurWeight * influenceFactor;
float weight = blurWeight * influenceFactor;
nor2 = getNor(textureLod(gbuffer0, texCoord - pos * dirInv, 0.0).rg);
influenceFactor = step(discardThreshold, dot(nor2, nor));
col = textureLod(tex, texCoord - posadd * dirInv, 0.0).r;
fragColor += col * blurWeight * influenceFactor;
weight += blurWeight * influenceFactor;
return weight;
}
const int KERNEL_SIZE = 13;
const float blurWeights[13] = float[](0.1, 0.09, 0.08, 0.07, 0.06, 0.05, 0.04, 0.03, 0.025, 0.02, 0.015, 0.01, 0.005);
void main() {
vec3 nor = getNor(textureLod(gbuffer0, texCoord, 0.0).rg);
vec3 centerNor = getNor(textureLod(gbuffer0, texCoord, 0.0).rg);
float centerDepth = textureLod(gbufferD, texCoord, 0.0).r;
fragColor = textureLod(tex, texCoord, 0.0).r * blurWeights[0];
float weight = blurWeights[0];
for (int i = 1; i < 5; i++) {
weight += doBlur(blurWeights[i], i, nor, texCoord);
// skip sky pixels
if (centerDepth == 1.0) {
fragColor = vec3(0.0);
return;
}
fragColor = textureLod(tex, texCoord, 0.0).rgb * blurWeights[0];
float totalWeight = blurWeights[0];
for (int i = 1; i < KERNEL_SIZE; i++) {
vec2 offset = float(i) * dirInv;
vec2 uvPos = texCoord + offset;
vec3 norPos = getNor(textureLod(gbuffer0, uvPos, 0.0).rg);
float depthPos = textureLod(gbufferD, uvPos, 0.0).r;
float normalWeight = max(0.0, dot(norPos, centerNor));
normalWeight = pow(normalWeight, 8.0); // Softer normal falloff for better blending
float depthWeight = 1.0 - smoothstep(0.0, 0.02, abs(depthPos - centerDepth));
float w = blurWeights[i] * normalWeight * depthWeight;
fragColor += textureLod(tex, uvPos, 0.0).rgb * w;
totalWeight += w;
vec2 uvNeg = texCoord - offset;
vec3 norNeg = getNor(textureLod(gbuffer0, uvNeg, 0.0).rg);
float depthNeg = textureLod(gbufferD, uvNeg, 0.0).r;
normalWeight = max(0.0, dot(norNeg, centerNor));
normalWeight = pow(normalWeight, 8.0);
depthWeight = 1.0 - smoothstep(0.0, 0.02, abs(depthNeg - centerDepth));
w = blurWeights[i] * normalWeight * depthWeight;
fragColor += textureLod(tex, uvNeg, 0.0).rgb * w;
totalWeight += w;
}
fragColor = fragColor / weight;
fragColor /= totalWeight;
}