source: GTP/branches/IllumWPdeliver2008dec/IlluminationWP/demos/Standalone/DepthOfField [DirectX]/shaders/CameraEffects.fx @ 3255

Revision 3255, 2.5 KB checked in by szirmay, 15 years ago (diff)
Line 
1// Number of outer filter taps
2#define NUM_DOF_TAPS 12
3float2 filterTaps[NUM_DOF_TAPS];
4
5
6#define SAMPLER_LINEAR(g_samplerMap, g_txMap);  \
7        sampler2D g_samplerMap = sampler_state {        \
8    Texture = <g_txMap>;                                                \
9    MinFilter = Linear;                                                 \
10    MagFilter = Linear;                                                 \
11    MipFilter = Linear;                                                 \
12    AddressU  = WRAP;                                                   \
13    AddressV  = WRAP;                                                   \
14};
15
16texture ColorMap;
17SAMPLER_LINEAR(ColorMapSampler, ColorMap);
18texture DepthMap;
19SAMPLER_LINEAR(DepthMapSampler, DepthMap);
20
21struct VS_INPUT {
22                float3 Position : POSITION;
23};
24
25struct VS_OUTPUT {
26        float4 hPosition : POSITION;     // point in normalized device space before homogeneous division
27        float2 TexCoord  : TEXCOORD0;
28};
29
30VS_OUTPUT DepthVS(VS_INPUT IN)
31{
32        VS_OUTPUT output;
33   
34    output.hPosition = half4(IN.Position, 1);
35   
36    output.TexCoord = IN.Position.xy * 0.5f + 0.5f;
37    output.TexCoord.y *= -1;
38
39    return output;
40}
41//------------------------------------------------------------------------------------
42//
43//
44//
45//------------------------------------------------------------------------------------
46const float maxCoC = 5;
47float4 DepthPS(VS_OUTPUT IN) : COLOR
48{
49        // Get center sample
50        float4 colorSum = tex2D(ColorMapSampler, IN.TexCoord);
51        float2 centerDepthBlur = tex2D(DepthMapSampler, IN.TexCoord);
52
53        // Compute CoC size based on blurriness
54        float sizeCoC = centerDepthBlur.y * maxCoC;
55
56        float totalContribution = 1.0f;
57
58        // Run through all taps
59        for (int i = 0; i < NUM_DOF_TAPS; i++)
60        {
61                // Compute tap coordinates
62                float2 tapCoord = IN.TexCoord + filterTaps[i] * sizeCoC;
63
64                // Fetch tap sample
65                float4 tapColor = tex2D(ColorMapSampler, tapCoord);
66                float2 tapDepthBlur = tex2D(DepthMapSampler, tapCoord);
67
68                // Compute tap contribution
69                float tapContribution = (tapDepthBlur.x > centerDepthBlur.x) ? 1.0f : tapDepthBlur.y;
70
71                // Accumulate color and contribution
72                colorSum += tapColor * tapContribution;
73                totalContribution += tapContribution;
74        }
75
76        // Normalize to get proper luminance
77        float4 finalColor = colorSum / totalContribution;
78
79        return finalColor;
80}
81//------------------------------------------------------------------------------------
82// Technique definitions
83//------------------------------------------------------------------------------------
84technique DepthOfField
85{                                                                                                       
86    pass p0                                                                                     
87    {                                                                                           
88            VertexShader = compile vs_3_0 DepthVS();   
89            PixelShader  = compile ps_3_0 DepthPS();   
90        }                                                                                               
91}
Note: See TracBrowser for help on using the repository browser.