#include "../shaderenv.h" struct fragment { float2 texCoords: TEXCOORD0; }; float2 ComputeBlurFactors(float4 color, float sceneRange, float zFocus) { float2 result; const float m = 1.0f; const float focalLen = 1.0f; const float scale = 5e4f; // Compute blur factor based on the CoC size scaled and normalized to 0..1 range //float blur = abs(dLens * focalLen * (zFocus - color.w)) / (1e-6f + abs(zFocus * (color.w - focalLen))); const float dist = abs(zFocus - color.w); const float blur = scale * m * focalLen * dist / (sceneRange * (1e-6f + abs(color.w + dist * step(0, zFocus - color.w)))); //float blur = saturate(blur * scale / maxCoC); // Depth/blurriness value scaled to 0..1 range result = float2(color.w / sceneRange, blur); return result; } float4 Blur(float4 color, float2 texCoords, float2 blurFactors, sampler2D colorsTex, float2 filterOffs[NUM_DOF_TABS] ) { float4 avgCol = float4(.0f); float total_w = .0f; for (int i = 0; i < NUM_DOF_TABS; ++ i) { float2 sampleTexCoord = texCoords + filterOffs[i] * blurFactors.y; float4 sampleCol = tex2Dlod(colorsTex, float4(sampleTexCoord, 0, 0)); // combine the weights float w = 1; avgCol += sampleCol * w; total_w += w; } avgCol /= max(total_w, 1e-6f); return avgCol; } float4 DepthOfField(fragment IN, uniform sampler2D colorsTex, uniform float2 filterOffs[NUM_DOF_TABS], uniform float sceneRange, uniform float zFocus ): COLOR { // center color const float4 color = tex2Dlod(colorsTex, float4(IN.texCoords, 0, 0)); zFocus = min(zFocus, sceneRange * 0.5f); float2 blurFactors = ComputeBlurFactors(color, sceneRange, zFocus); //float4 outCol = float4(color.x, color.y, blurFactors.y, color.w); float4 outCol = Blur(color, IN.texCoords, blurFactors, colorsTex, filterOffs); return outCol; }