struct VS_OUT { float4 hPosition : POSITION; float4 cPosition : TEXCOORD0; float radius : TEXCOORD2; float4 texCoord : TEXCOORD1; }; VS_OUT VP(float4 mPosition : POSITION, uniform float4x4 worldView, uniform float4x4 Proj, uniform float4x4 worldViewProj float2 texCoord :TEXCOORD0) { VS_OUT Out; Out.texCoord.xy = texCoord; Out.texCoord.zw = (texCoord * 2.0) - 1.0; float2 offset = texCoord.zw; float4 cPosition = mul(worldView, mPosition); cPosition.xy += offset; Out.hPosition = mul( Proj, cPosition ); Out.cPosition = cPosition; Out.radius = abs(offset.x); return OUT; } float4 FP(VS_OUT In, uniform float4x4 Proj, uniform sampler2D Texture):COLOR { float4 color = 1; float front = 0; float back = 1; float4 tex = tex2D(Texture, In.texCoord.xy); float d = length(In.TexCoord.zw); float w = sqrt(In.radius * In.radius - d * d); if(d < r) { float4 positionF; float4 positionB; positionF = positionB = In.cPosition; positionF.z -= w; positionB.z += w; positionF = mul(Proj, positionF); positionB = mul(Proj, positionB); positionF = (positionF / positionF.w + 1.0) / 2.0; positionB = (positionB / positionB.w + 1.0) / 2.0; } color.rgb = positionF.z; return color; }