1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| vec4 antiAliasing_Custom(sampler2D sceneTexture, vec2 uv) { vec2 texelSize = 1.0 / textureSize(sceneTexture, 0); vec3 rgbNW = texture(sceneTexture, uv + vec2(-1.0, -1.0) * texelSize).rgb; vec3 rgbNE = texture(sceneTexture, uv + vec2(1.0, -1.0) * texelSize).rgb; vec3 rgbSW = texture(sceneTexture, uv + vec2(-1.0, 1.0) * texelSize).rgb; vec3 rgbSE = texture(sceneTexture, uv + vec2(1.0, 1.0) * texelSize).rgb; vec3 rgbM = texture(sceneTexture, uv).rgb; float lumaNW = dot(rgbNW, vec3(0.299, 0.587, 0.114)); float lumaNE = dot(rgbNE, vec3(0.299, 0.587, 0.114)); float lumaSW = dot(rgbSW, vec3(0.299, 0.587, 0.114)); float lumaSE = dot(rgbSE, vec3(0.299, 0.587, 0.114)); float lumaM = dot(rgbM, vec3(0.299, 0.587, 0.114)); float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); vec2 dir = vec2( -((lumaNW + lumaNE) - (lumaSW + lumaSE)), ((lumaNW + lumaSW) - (lumaNE + lumaSE)) ); float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * 0.25 * 0.1667, 0.0833); float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce); dir = min(vec2(8.0), max(vec2(-8.0), dir * rcpDirMin)) * texelSize; vec3 rgbA = 0.5 * ( texture(sceneTexture, uv + dir * (1.0/3.0 - 0.5)).rgb + texture(sceneTexture, uv + dir * (2.0/3.0 - 0.5)).rgb ); vec3 rgbB = rgbA * 0.5 + 0.25 * ( texture(sceneTexture, uv + dir * -0.5).rgb + texture(sceneTexture, uv + dir * 0.5).rgb ); float lumaB = dot(rgbB, vec3(0.299, 0.587, 0.114)); if ((lumaB < lumaMin) || (lumaB > lumaMax)) { return vec4(rgbA, 1.0); } else { return vec4(rgbB, 1.0); } }
vec3 reflectDir = reflect(-viewDir, normal); vec3 rayOrigin = worldPos; vec3 rayDirection = reflectDir; float stepSize = 0.1; for (int i = 0; i < MAX_SSR_STEPS; i++) { vec3 samplePos = rayOrigin + rayDirection * stepSize * float(i); vec2 screenUV = (clipPos.xy / clipPos.w) * 0.5 + 0.5; break; } float sceneDepth = texture(depthTexture, screenUV).r; float sampleDepth = clipPos.z / clipPos.w; if (sampleDepth > sceneDepth + 0.001) { } } return vec3(0.0);
|