source: GTP/trunk/App/Demos/Illum/Hierarchical Systems Demo [OpenGL]/src/ScatterIllumPrograms.cg @ 852

Revision 852, 4.5 KB checked in by szirmay, 19 years ago (diff)
Line 
1struct VertexOut
2{
3        float4 VertexPosition           :POSITION;
4        float2 TexCoord                         :TEXCOORD;
5};
6
7
8/*
9  Vertex program for cloud rendering
10*/
11VertexOut VertexProgram( float4 Position :POSITION,
12                                                float2 Texcoord: TEXCOORD
13                                                )                                                                       
14{
15        VertexOut Out; 
16       
17        Out.VertexPosition=Position;
18        Out.TexCoord=Texcoord;
19       
20        return Out;     
21}
22
23/*
24  Fragment program for cloud rendering
25*/
26float4 FragmentProgram( VertexOut       In,
27                                                uniform float Albedo,
28                                                uniform float Transparency,
29                                                uniform float Symmetry,
30                                                uniform samplerRECT IllumTexture,
31                                                uniform samplerRECT PhaseTexture,
32                                                uniform samplerRECT AngleTexture):COLOR
33{
34        In.TexCoord.y=1-In.TexCoord.y;
35        float uvsize=256;       
36        float4 Color=texRECT(IllumTexture,In.TexCoord*uvsize);
37       
38        if(Color.a!=1)
39        {
40               
41                //3 random uv's
42                float transparency=Transparency;
43                float albedo=Albedo;
44                float t=0.3;
45                float g=Symmetry;
46               
47                float2 Rand1=(float2(noise(float3(In.TexCoord,t)),noise(float3(In.TexCoord.x,t,In.TexCoord.y))))*10;
48                float2 Rand2=(float2(noise(float3(In.TexCoord.yx,t)),noise(float3(In.TexCoord.y,t,In.TexCoord.x))))*10;
49                float2 Rand3=(float2(noise(float3(t,In.TexCoord)),noise(float3(t,In.TexCoord.yx))))*10;
50               
51                float3 dist;
52                float3 Cosangles;
53                float3 PhasesFront;
54                float3 PhasesBack;
55                float3 Scattering;
56               
57                float3 RedSamples;
58                float3 GreenSamples;
59                float3 BlueSamples;
60                float3 AlphaSamples;
61               
62                /*
63                float2 point1=saturate(In.TexCoord+Rand1)*uvsize;       
64                float2 point2=saturate(In.TexCoord+Rand2)*uvsize;
65                float2 point3=saturate(In.TexCoord+Rand3)*uvsize;
66               
67                RedSamples=float3(texRECT(IllumTexture,point1).r,texRECT(IllumTexture,point2).r,texRECT(IllumTexture,point3).r);
68                GreenSamples=float3(texRECT(IllumTexture,point1).g,texRECT(IllumTexture,point2).g,texRECT(IllumTexture,point3).g);
69                BlueSamples=float3(texRECT(IllumTexture,point1).b,texRECT(IllumTexture,point2).b,texRECT(IllumTexture,point3).b);
70                AlphaSamples=float3(texRECT(IllumTexture,point1).a,texRECT(IllumTexture,point2).a,texRECT(IllumTexture,point3).a);
71                */
72               
73                In.TexCoord*=uvsize;
74               
75                RedSamples=float3(texRECT(IllumTexture,In.TexCoord+Rand1).r,texRECT(IllumTexture,In.TexCoord+Rand2).r,texRECT(IllumTexture,In.TexCoord+Rand3).r);
76                GreenSamples=float3(texRECT(IllumTexture,In.TexCoord+Rand1).g,texRECT(IllumTexture,In.TexCoord+Rand2).g,texRECT(IllumTexture,In.TexCoord+Rand3).g);
77                BlueSamples=float3(texRECT(IllumTexture,In.TexCoord+Rand1).b,texRECT(IllumTexture,In.TexCoord+Rand2).b,texRECT(IllumTexture,In.TexCoord+Rand3).b);
78                AlphaSamples=float3(texRECT(IllumTexture,In.TexCoord+Rand1).a,texRECT(IllumTexture,In.TexCoord+Rand2).a,texRECT(IllumTexture,In.TexCoord+Rand3).a);
79               
80                /*     
81                //background   
82                if(RedSamples.x==1)RedSamples.x=0;
83                if(RedSamples.y==1)RedSamples.y=0;
84                if(RedSamples.z==1)RedSamples.z=0;
85                if(GreenSamples.x==1)GreenSamples.x=0;
86                if(GreenSamples.y==1)GreenSamples.y=0;
87                if(GreenSamples.z==1)GreenSamples.z=0;
88                if(BlueSamples.x==1)BlueSamples.x=0;
89                if(BlueSamples.y==1)BlueSamples.y=0;
90                if(BlueSamples.z==1)BlueSamples.z=0;
91                */
92               
93                dist=float3(length(Rand1),length(Rand2),length(Rand3));
94               
95                Cosangles=float3(texRECT(AngleTexture,float2(dist.x,0.25)).r,
96                                                texRECT(AngleTexture,float2(dist.y,0.25)).r,
97                                                texRECT(AngleTexture,float2(dist.z,0.25)).r)/2;
98                       
99                PhasesFront=float3(texRECT(PhaseTexture,float2(g,0.5+Cosangles.x)*256).r,
100                                        texRECT(PhaseTexture,float2(g,0.5+Cosangles.y)*256).r,
101                                        texRECT(PhaseTexture,float2(g,0.5+Cosangles.z)*256).r);
102                PhasesBack=float3(texRECT(PhaseTexture,float2(g,0.5-Cosangles.x)*256).r,
103                                        texRECT(PhaseTexture,float2(g,0.5-Cosangles.y)*256).r,
104                                        texRECT(PhaseTexture,float2(g,0.5-Cosangles.z)*256).r);
105               
106                PhasesFront*=transparency*albedo/12.5;
107                PhasesBack*=transparency*albedo/12.5;
108               
109                //Red Channel
110                //Scattering=Color.g*PhasesBack;       
111                Scattering=GreenSamples*PhasesBack;     
112                Color.r+=Scattering.x+Scattering.y+Scattering.z;
113               
114                //Green Channel
115                //Scattering=Color.b*PhasesBack+Color.r*PhasesFront;
116                Scattering=RedSamples*PhasesFront+BlueSamples*PhasesBack;       
117                Color.g+=Scattering.x+Scattering.y+Scattering.z;
118               
119                //Blue Channel
120                //Scattering=Color.a*PhasesBack+Color.g*PhasesFront;
121                Scattering=GreenSamples*PhasesFront+AlphaSamples*PhasesBack;   
122                Color.b+=Scattering.x+Scattering.y+Scattering.z;
123               
124                //Alpha Channel
125                //Scattering=Color.b*PhasesFront;
126                Scattering=BlueSamples*PhasesFront;     
127                Color.a+=Scattering.x+Scattering.y+Scattering.z;
128                                               
129        }
130        else
131        {
132                Color=float4(1,1,1,1);
133        }
134       
135        return Color;
136}
137
138
Note: See TracBrowser for help on using the repository browser.