struct VertexOut { float4 VertexPosition :POSITION; float2 TexCoord :TEXCOORD; float4 Position :TEXCOORD1; float4 EyePosition :TEXCOORD2; float2 BbSizeAngleCos :TEXCOORD3; float4 LightSpacePos :TEXCOORD4; float4 Color :COLOR0; }; // // Vertex program for displaying particle system with rectangle rendertexture // VertexOut VertexProgram( float4 Position :POSITION, float4 Texcoord: TEXCOORD, float4 Color:COLOR0, uniform float4x4 LightModelViewProj, uniform float3 LightPosition, uniform float3 EyePosition, uniform float4x4 ModelViewProj :state.matrix.mvp ) { VertexOut Out; Out.Color=Color; Out.VertexPosition=mul(ModelViewProj, Position); Out.TexCoord=Texcoord.xy; Out.LightSpacePos=mul(LightModelViewProj, Position); Out.LightSpacePos.xyz=Out.LightSpacePos.xyz/Out.LightSpacePos.w; Out.LightSpacePos.xyz=(Out.LightSpacePos.xyz+1.0)/2.0; float3 LightToPoint=normalize(Position.xyz-LightPosition); float3 PointToEye=normalize(EyePosition-Position.xyz); Out.BbSizeAngleCos.y=(dot(LightToPoint,PointToEye)+1.0)/2.0; return Out; } // // Fragment program for displaying particle system with rectangle rendertexture // void FragmentProgram( VertexOut In, uniform samplerRECT FrontTexture, uniform samplerRECT Illum1, uniform samplerRECT PhaseTexture, uniform float Albedo, uniform float Transparency, uniform float Symmetry, uniform float3 LightColor, float4 out Color:COLOR ) { float2 illumUV=In.LightSpacePos.xy*256; float z=In.LightSpacePos.z; float3 start; float3 end; float3 temp; float density=texRECT(FrontTexture,In.TexCoord*256).a;//density float4 planes=float4(0.33,0.5,0.66,1); float t; if(z=planes.x) { start=texRECT(Illum1,illumUV).r; end=texRECT(Illum1,illumUV).g; t=(z-planes.x)/(planes.y-planes.x); temp=lerp(start,end,t); } if(z>=planes.y&&z=planes.z) { start=texRECT(Illum1,illumUV).b; end=texRECT(Illum1,illumUV).a; t=(z-planes.z)/(1-planes.z); temp=lerp(start,end,t); } float phase=texRECT(PhaseTexture,float2(Symmetry,In.BbSizeAngleCos.y)*256); float realdens=density*Transparency; float scatter=realdens*Albedo; float outcol=temp*phase*scatter; float scateeredforward=scatter*texRECT(PhaseTexture,float2(Symmetry,1)*256); Color=float4(LightColor*outcol*In.Color.rgb,1-realdens+scateeredforward/6.28); }