#define D 128 struct VertexOut { float4 VertexPosition :POSITION; float2 TexCoord :TEXCOORD; int ID :TEXCOORD1; }; /* Vertex program for cloud rendering */ VertexOut VertexProgram( float4 Position :POSITION, float2 Texcoord: TEXCOORD ) { VertexOut Out; Out.VertexPosition=Position; Out.TexCoord=Texcoord; Out.ID=Texcoord.x; return Out; } /* Fragment program for cloud rendering */ float3 FragmentProgram( VertexOut In, uniform samplerRECT LVisMap, uniform samplerRECT Phase, uniform float4 LightDirsWeights, uniform float3 LightRad, uniform float3 LightRad2, uniform float2 Alb_Op):COLOR { float3 Color=float3(0,0,0); int direction=floor(In.TexCoord.y); int negDir=D-1-direction; int particle=In.ID; float a_o=Alb_Op.x*Alb_Op.y; //Light1 int LDir=floor(LightDirsWeights.x); float isvisible=texRECT(LVisMap,float2(particle,0)).r; //Scattering Color+=isvisible*a_o*texRECT(Phase,float2(LDir,negDir)).r*LightRad; //Transmittance if(direction==LDir) { //Color+=LightRad*(1-Alb_Op.y)*isvisible; Color+=LightRad*isvisible; } //Light2 int LDir2=floor(LightDirsWeights.y); isvisible=texRECT(LVisMap,float2(particle,1)).r; //isvisible=1; //Scattering Color+=isvisible*a_o*texRECT(Phase,float2(LDir2,negDir)).r*LightRad2; //Transmittance if(direction==LDir2) { //Color+=LightRad2*(1-Alb_Op.y)*isvisible; Color+=LightRad2*isvisible; } ///Emission //Color+=float3(0.01,0.01,0.01); return Color; }