struct VertexOut { float4 Position :POSITION; float2 TexCoord :TEXCOORD; float2 PolarCoord :TEXCOORD1; float ID :TEXCOORD2; float PSize :PSIZE; }; VertexOut VertexProgram( float4 Position : POSITION, float ID : TEXCOORD0, float4 Color : COLOR0, uniform float4 PSize : state.point.size, uniform float4x4 modelView : state.matrix.modelview, uniform float4x4 modelViewProj:state.matrix.mvp, uniform float3 EyePosition ) { VertexOut Out; Out.ID=ID*512; float4 pos_eye = mul(modelView, Position); float dist = length(pos_eye.xyz); Out.PSize =PSize.x*sqrt(1.0 / (1 + dist*dist)); Out.Position = mul(modelViewProj, Position); float3 toLight=-1*pos_eye.xyz; //polar coord float3 dir0=normalize(toLight); float2 angles; angles.y=asin(dir0.y); // -pi/2 -- pi/2 float2 d=normalize(dir0.xz); angles.x=acos(d.x)*sign(d.y); // -pi -- pi angles.x=angles.x/6.28+0.5; // 0 -- 1 angles.y=angles.y/3.14+0.5; // 0 -- 1 Out.PolarCoord=angles; return Out; } float4 FragmentProgram(VertexOut In, uniform sampler2D BbTexture, uniform sampler2D DirMap, uniform samplerRECT IllumTexture ) : COLOR { float4 Color=float4(0,0,0,0); float nearestdir=tex2D(DirMap,In.PolarCoord).r; float nearestdir2=tex2D(DirMap,In.PolarCoord).g; float weight1=tex2D(DirMap,In.PolarCoord).b; float weight2=tex2D(DirMap,In.PolarCoord).a; Color.rgb=texRECT(IllumTexture,float2(In.ID,nearestdir*64))*weight1; Color.rgb+=texRECT(IllumTexture,float2(In.ID,nearestdir2*64))*weight2; Color.a=tex2D(BbTexture, In.TexCoord.xy).r*0.6; return Color; }