struct VertexOut { float4 VertexPosition :POSITION; float2 TexCoord :TEXCOORD; }; /* Vertex program for cloud rendering */ VertexOut VertexProgram( float4 Position :POSITION, float2 Texcoord: TEXCOORD, uniform float4x4 ModelViewProj :state.matrix.mvp ) { VertexOut Out; Out.VertexPosition=mul(ModelViewProj, Position); Out.TexCoord=Texcoord; return Out; } /* Fragment program for cloud rendering */ float3 FragmentProgram( VertexOut In, uniform samplerRECT IllumTexture, uniform samplerRECT VisMap, uniform samplerRECT DirectIllum, uniform samplerRECT Phase, uniform float2 Alb_Op ):COLOR { int thisDir=round(In.TexCoord.y); int thisID=round(In.TexCoord.x); float3 DirectRad; float3 Radin; float3 Color=float3(0,0,0); //texRECT(IllumTexture,float2(thisID,thisDir)).rgb; int visibleID=round(texRECT(VisMap,float2(thisID,thisDir)).r); if(visibleID<512) { DirectRad=texRECT(DirectIllum,float2(visibleID,thisDir)).rgb; Radin=texRECT(IllumTexture,float2(visibleID,thisDir)).rgb; Color+=(1-Alb_Op.y)*(Radin+DirectRad); } float a_o=Alb_Op.x*Alb_Op.y*1.0/4.0; for(int d=0;d<4;d++) { visibleID=round(texRECT(VisMap,float2(thisID,d)).r); if(visibleID<4) { DirectRad=texRECT(DirectIllum,float2(visibleID,thisDir)).rgb; Radin=texRECT(IllumTexture,float2(visibleID,d)); Color+=(Radin+DirectRad)*a_o*texRECT(Phase,float2(d,thisDir)).r; } } return Color; }