source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/mrt.cg @ 3005

Revision 3005, 3.7 KB checked in by mattausch, 16 years ago (diff)
RevLine 
[3004]1// input
2struct vtxin
3{
4  float4 position: POSITION;
5  float3 normal: NORMAL;
6  float4 color: COLOR0;
7  float4 texCoord: TEXCOORD0;
8};
9
10// vtx output
11struct vtxout
12{
13  float4 position: POSITION; // eye space
14  float4 texCoord: TEXCOORD0;   
15
16  float4 color: COLOR0; 
17  float4 worldPos: TEXCOORD1; // world position
18  float3 normal: TEXCOORD2;
19  float4 mypos: TEXCOORD3;
20};
21
22
23// fragment input
24struct fragin
25{
26        float4 color: COLOR0; 
27        float4 position: POSITION; // eye space
28        float4 texCoord: TEXCOORD0;   
29
30        float4 projPos: WPOS;
31        float4 worldPos: TEXCOORD1; // world position
32        float3 normal: TEXCOORD2;
33        float4 mypos: TEXCOORD3;
34};
35
36
37struct pixel
38{
[3005]39        float4 col: COLOR0;
40        //float4 pos: COLOR1;
41        float3 pos: COLOR1;
42        float4 norm: COLOR2;
[3004]43};
44
45#pragma position_invariant vtx
46
47vtxout vtx(vtxin IN,
48                   const uniform float4x4 ModelViewProj,
49                   uniform float4x4 ModelView)
50{
51        vtxout OUT;
52
53        OUT.color = IN.color;
54        OUT.texCoord = IN.texCoord;
55
56        //OUT.worldPos = mul(glstate.matrix.inverse.projection, OUT.position);
57        OUT.worldPos = mul(ModelView, IN.position);
58        // transform the vertex position into eye space
59        OUT.position = mul(glstate.matrix.mvp, IN.position);
60
61        OUT.normal = IN.normal;
62        OUT.mypos = OUT.position;
63
64        return OUT;
65}
66
67
68// bilinear interpolation
[2999]69inline float3 Interpol(float2 w, float3 bl, float3 br, float3 tl, float3 tr)
70{
71        float3 x1 = lerp(bl, tl, w.y);
72        float3 x2 = lerp(br, tr, w.y);
73        float3 v = lerp(x1, x2, w.x);
74
75        return v;
[3004]76}
77
78
79pixel fragtex(fragin IN,
80                          uniform sampler2D dirtTex,
81                          uniform float maxDepth,
82                          uniform sampler2D tex,
83                          uniform float3 eyePos,
[2999]84                          uniform float3 bl,
85                          uniform float3 br,
[3004]86                          uniform float3 tl,
87                          uniform float3 tr
88                          )
89{
90        float4 texColor = tex2D(tex, IN.texCoord.xy);
91
92        // account for alpha blending
93        if (texColor.w < 0.5f) discard;
94
95        pixel pix;
96
97        // save color in first render target
98        // hack: use combination of emmisive + diffuse (emmisive used as constant ambient term)
99        pix.col = (glstate.material.emission + glstate.material.diffuse) * texColor;
100        // save world space normal in third rt
101        pix.norm.xyz = IN.normal;
102        // store projection coordinates with positions (used for ssao)
103        pix.norm.w = IN.projPos.w;
104
105        const float4 projPos = IN.mypos / IN.mypos.w;
106       
107        // hack: squeeze some information about ambient into the texture
108        //pix.col.w = glstate.material.emission.x;
109
110        // compute eye linear depth
111        const float2 screenCoord = projPos.xy * 0.5f + 0.5f;
112        const float magView = length(Interpol(screenCoord, bl, br, tl, tr));
113        pix.col.w = length(eyePos - IN.worldPos.xyz) * maxDepth / magView;
114
[3005]115#if 1
[3004]116        // save world position in second render target
[3005]117        pix.pos = IN.worldPos.xyz * maxDepth;
118#endif
[3004]119
120        return pix;
121}
122
123
124pixel frag(fragin IN,
125                   uniform float maxDepth,
126                   uniform float3 eyePos,
[2999]127                   uniform float3 bl,
[3004]128                   uniform float3 br,
129                   uniform float3 tl,
130                   uniform float3 tr)
131{
132        pixel pix;
133
134        // hack: use comination of emmisive + diffuse (emmisive used as constant ambient term)
135        pix.col = glstate.material.diffuse + glstate.material.emission;
136
137        pix.norm.xyz = IN.normal;
138       
139        // store projection coordinates with positions (used for ssao)
140        pix.norm.w = IN.mypos.w;
141
142        const float4 projPos = IN.mypos / IN.mypos.w;
143
144        // hack: squeeze some information about the ambient term into the target
145        //pix.col.w = glstate.material.emission.x;
146       
147        // compute eye linear depth
148        float2 screenCoord = projPos.xy * 0.5f + 0.5f;
149        const float magView = length(Interpol(screenCoord, bl, br, tl, tr));
150        pix.col.w = length(eyePos - IN.worldPos.xyz) * maxDepth / magView;
151
[3005]152#if 1
153        pix.pos = IN.worldPos.xyz * maxDepth;
154#endif
[3004]155
156        return pix;
[2928]157}
Note: See TracBrowser for help on using the repository browser.