1 | #include "../shaderenv.h"
|
---|
2 |
|
---|
3 | struct fragment
|
---|
4 | {
|
---|
5 | float2 texCoords: TEXCOORD0;
|
---|
6 | };
|
---|
7 |
|
---|
8 | // the barrier for detecting a discontinuity (x = normal, y = depth)
|
---|
9 | //const uniform float4 barrier = float4(5e-5f, 5e-5f, 0, 0);
|
---|
10 | const uniform float4 barrier = float4(0.6f, 9e-2f, 0, 0);
|
---|
11 | // the weights for normal / depth discontinuity (x = normal, y = depth)
|
---|
12 | const uniform float4 weights = float4(0.5f, 0.5f, 1.0f, 1.0f);
|
---|
13 | //uniform float4 weights = float4(1.0f, 1.0f, 1.0f, 1.0f);
|
---|
14 | // the maximal size of the filter kernel
|
---|
15 | const uniform float kernel = 0.5f;
|
---|
16 |
|
---|
17 |
|
---|
18 |
|
---|
19 | float4 main(fragment IN,
|
---|
20 | uniform sampler2D colors,
|
---|
21 | uniform sampler2D normals,
|
---|
22 | uniform float2 offsets[8]): COLOR
|
---|
23 | {
|
---|
24 | // center normal
|
---|
25 | const float3 centerNormal = tex2Dlod(normals, float4(IN.texCoords, 0, 0)).xyz;
|
---|
26 | // center color
|
---|
27 | const float4 centerColor = tex2Dlod(colors, float4(IN.texCoords, 0, 0));
|
---|
28 | // center depth
|
---|
29 | const float4 centerDepth = float4(centerColor.w);
|
---|
30 |
|
---|
31 | const float2 lt = IN.texCoords + offsets[0];
|
---|
32 | const float2 rb = IN.texCoords + offsets[1];
|
---|
33 | const float2 rt = IN.texCoords + offsets[2];
|
---|
34 | const float2 lb = IN.texCoords + offsets[3];
|
---|
35 |
|
---|
36 | // compute normal discontinuities
|
---|
37 | float4 nd;
|
---|
38 |
|
---|
39 | nd.x = dot(centerNormal, tex2Dlod(normals, float4(lt, 0, 0)).xyz);
|
---|
40 | nd.y = dot(centerNormal, tex2Dlod(normals, float4(rb, 0, 0)).xyz);
|
---|
41 | nd.z = dot(centerNormal, tex2Dlod(normals, float4(rt, 0, 0)).xyz);
|
---|
42 | nd.w = dot(centerNormal, tex2Dlod(normals, float4(lb, 0, 0)).xyz);
|
---|
43 |
|
---|
44 | nd -= float4(barrier.x);
|
---|
45 | nd = step(float4(0.0f), nd);
|
---|
46 |
|
---|
47 | // weight the influence of normal discontinuities
|
---|
48 | //const float ne = saturate(dot(nd, weights.x));
|
---|
49 | const float ne = nd.x * nd.y * nd.z * nd.w * weights.x;
|
---|
50 |
|
---|
51 |
|
---|
52 | ////////////
|
---|
53 | // depth filter => compute gradient difference
|
---|
54 | // (c - sample) + (c - opposite sample)
|
---|
55 |
|
---|
56 | float depthVals[8];
|
---|
57 |
|
---|
58 | for (int i = 0; i < 8; ++ i)
|
---|
59 | {
|
---|
60 | depthVals[i] = (float)tex2Dlod(colors, float4(IN.texCoords + offsets[i], 0, 0)).w;
|
---|
61 | }
|
---|
62 |
|
---|
63 | float4 dd; // the gradients
|
---|
64 |
|
---|
65 | dd[0] = depthVals[0] + depthVals[1];
|
---|
66 | dd[1] = depthVals[2] + depthVals[3];
|
---|
67 | dd[2] = depthVals[4] + depthVals[5];
|
---|
68 | dd[3] = depthVals[6] + depthVals[7];
|
---|
69 |
|
---|
70 | //for (int i = 0; i < 4; ++ i)
|
---|
71 | // dd[i] = depthVals[i * 2] + depthVals[i * 2 + 1];
|
---|
72 |
|
---|
73 | //dd = abs(2.0f * (1.0f - abs(1.0f - centerDepth / dd))) - barrier.y;
|
---|
74 | dd = abs(2.0f * centerDepth - dd) - barrier.y;
|
---|
75 | dd = step(dd, float4(0.0f));
|
---|
76 |
|
---|
77 | //const float de = saturate(dot(dd, weights.y));
|
---|
78 | const float de = weights.y * dd.x * dd.y * dd.z * dd.w;
|
---|
79 |
|
---|
80 |
|
---|
81 | ///////////////////////////
|
---|
82 |
|
---|
83 | // weight: 0 = no antialiasing, 1 = full antialiasing
|
---|
84 | const float w = (1.0f - de * ne) * kernel.x;
|
---|
85 | // smoothed color: the offset is big where discontinuities are
|
---|
86 | // (a - c) * w + c = a * w + c * (1 - w)
|
---|
87 | const float2 width = IN.texCoords * (1.0f - w);
|
---|
88 |
|
---|
89 | float4 s0 = tex2Dlod(colors, float4(width + lt * w, 0, 0));
|
---|
90 | float4 s1 = tex2Dlod(colors, float4(width + rb * w, 0, 0));
|
---|
91 | float4 s2 = tex2Dlod(colors, float4(width + rt * w, 0, 0));
|
---|
92 | float4 s3 = tex2Dlod(colors, float4(width + lb * w, 0, 0));
|
---|
93 |
|
---|
94 |
|
---|
95 | //float4 col = (s0 + s1 + s2 + s3 + centerColor) * 0.2f;
|
---|
96 | float4 col = (s0 + s1 + s2 + s3) * 0.25f;
|
---|
97 | //float4 col = float4(ne.x, ne.x, ne.x, 0);
|
---|
98 | //float4 col = float4(de.x, de.x, de.x, 0);
|
---|
99 | //float4 col = float4(w, w, w, 0);
|
---|
100 |
|
---|
101 | // push through the current depth
|
---|
102 | col.w = centerDepth.x;
|
---|
103 |
|
---|
104 | return col;
|
---|
105 | } |
---|