source: GTP/branches/IllumWPdeliver2008dec/IlluminationWP/demos/OgreGames/CarGame/Media/materials/programs/Fire.hlsl @ 3255

Revision 3255, 3.3 KB checked in by szirmay, 15 years ago (diff)
Line 
1
2float farplane = 1000.0; //far plane
3float nearplane = 0.1; //far plane
4float width = 800;
5float height = 600;
6
7struct SBB_VS_OUT
8{
9        float4 hPosition        : POSITION;
10        float4 texCoord         : TEXCOORD0;
11        float3 P                : TEXCOORD1;
12        float3 Q                : TEXCOORD2;
13        float r                 : TEXCOORD3;
14        float2 screenCoord      : TEXCOORD4;   
15        float4 color            : COLOR0;
16};
17
18SBB_VS_OUT FireVS (float4 position : POSITION, 
19                float4 texCoord : TEXCOORD0,
20                float4 color    : COLOR,
21                uniform float4x4 worldView,
22                uniform float4x4 Proj,
23                uniform float4x4 worldViewProj)
24{
25        SBB_VS_OUT OUT;
26 
27        float2 offset = texCoord.zw;
28        float4 cPosition;   
29        float4 wPosition = position;   
30        cPosition = mul(worldView, wPosition); 
31        OUT.P = cPosition.xyz;
32        OUT.P.z = - 1 * OUT.P.z;
33        cPosition.xy += offset;                         
34        OUT.Q = cPosition.xyz; 
35        OUT.Q.z = OUT.P.z;
36        OUT.r = abs(texCoord.z);               
37
38   /*texCoord.y = 1.0 - texCoord.y;
39   float2 offset = texCoord.xy * 2.0 - 1.0;
40   float4 cPosition = mul(worldView, position);
41   OUT.P = cPosition.xyz;
42   OUT.P.z = - 1 * OUT.P.z; // - texCoord.w;
43   cPosition.xy += offset * texCoord.w;
44   OUT.Q = cPosition.xyz;
45   OUT.Q.z = OUT.P.z;
46   OUT.r = texCoord.w;*/
47 
48   OUT.hPosition = mul( Proj, cPosition );
49   OUT.screenCoord =  (OUT.hPosition.xy / OUT.hPosition.w + 1.0) / 2.0;
50   OUT.screenCoord.y = 1.0 - OUT.screenCoord.y;
51   OUT.screenCoord += float2(0.5/width, 0.5/height);   
52   
53   OUT.texCoord = texCoord;
54   OUT.color = color;
55
56
57  return OUT;
58}
59
60
61void FirePS(SBB_VS_OUT IN ,
62        //      in screenCoord : VPOS,
63                uniform sampler2D colorTexture : register(s0),
64                uniform sampler2D DepthMap : register(s1)
65                ,uniform sampler2D PlanckMap : register(s2),
66                uniform sampler2D gradTex : register(s3),
67                uniform sampler2D heatTex : register(s4),
68                out float4 Color : COLOR0,
69                out float4 Heat: COLOR1)
70{
71        Color = IN.color;
72        float alpha = 0;
73       
74       
75        float d = length( IN.Q - IN.P );
76        float Zs;
77       
78        if( d < IN.r )
79        {       
80                float w = sqrt( IN.r * IN.r - d * d );
81                alpha = w / IN.r;
82                //alpha *= pow( (IN.r-d) / IN.r , 2);
83       
84                float F = IN.Q.z - w;
85                float B = IN.Q.z + w;   
86
87                Zs = tex2D( DepthMap, IN.screenCoord ).r;
88                if(Zs == 0) Zs = farplane;
89                float ds = min( Zs, B ) - max( nearplane, F );   
90               
91                alpha *=  ds / w * 0.5;
92        }
93       
94        alpha = saturate(alpha);
95        Color.a = alpha * tex2D( colorTexture, IN.texCoord.xy).r ;
96        Color.a *= IN.color.a;
97        Color.rgb = tex2D( PlanckMap, Color.aa).rgb;
98        float grad = tex2D(gradTex, IN.texCoord.xy).r;
99        Color.a *= grad;
100
101        Heat = float4(0,0,0,0.5);       
102        Heat.rg = (tex2D(heatTex, IN.texCoord.xy).rg * 2.0 - 1.0) * grad * alpha * IN.color.a;
103       
104}
105
106struct VS_OUT
107{
108        float4 hPosition        : POSITION;
109        float2 texCoord         : TEXCOORD0;   
110};
111
112
113float4 FireHeatCompositorPS(VS_OUT IN,
114                uniform float width,
115                uniform float height,
116                uniform sampler2D Scene: register(s0)
117                ,uniform sampler2D FireColor: register(s1)
118                ,uniform sampler2D FireHeatNoise: register(s2)
119                 ):COLOR
120{       
121        float maxOffset = 0.035;
122        float4 Color = 1;
123
124        float2 offset = tex2D(FireHeatNoise,IN.texCoord ).rg;
125               
126        offset *= maxOffset;
127        float2 newTex = IN.texCoord + offset;
128        float4 SceneSample = tex2D(Scene, newTex );
129        float4 FireSample  = tex2D(FireColor, newTex );
130       
131        Color = SceneSample + FireSample;// + float4(offset,1,1);       
132       
133        return Color;
134}
135
Note: See TracBrowser for help on using the repository browser.