/******************************************************************************/ #include "!Header.h" #include "Sky.h" /******************************************************************************/ BUFFER(VolLight) Vec VolMax=Vec(1, 1, 1); Flt Light_point_range; BUFFER_END /******************************************************************************/ Vec4 VolDir_PS(NOPERSP Vec2 inTex :TEXCOORD0, NOPERSP Vec2 inPosXY:TEXCOORD1, NOPERSP PIXEL , uniform Int num , uniform Bool cloud ):COLOR { Vec obj =GetPosLinear(inTex, inPosXY); // use linear filtering because we may be drawing to a smaller RT Flt power =0, length=Length(obj); if( length>ShdRange) { obj *=ShdRange/length; length=ShdRange; } VecH2 jitter_value=ShadowJitter(pixel.xy); Int steps=80; LOOP for(Int i=0; iViewport.range) { obj *=Viewport.range/length; length=Viewport.range; } Vec from =ShdMatrix[3], to =Transform(obj, ShdMatrix); VecH2 jitter_value=ShadowJitter(pixel.xy); Int steps=48; LOOP for(Int i=0; iViewport.range) { obj *=Viewport.range/length; length=Viewport.range; } Vec from =ShdMatrix[3], to =Transform(obj, ShdMatrix); Int steps=48; VecH2 jitter_value=ShadowJitter(pixel.xy); LOOP for(Int i=0; iViewport.range) { obj *=Viewport.range/length; length=Viewport.range; } Vec from =ShdMatrix[3], to =Transform(obj, ShdMatrix); Int steps=48; VecH2 jitter_value=ShadowJitter(pixel.xy); LOOP for(Int i=0; i=cur) { power+=ShadowConeValue(obj*(Flt(i)/steps), jitter_value, true)*LightConeDist(pos*scale)*LightConeAngle(pos.xy/pos.z); } } return Vec4(Light_cone.color.rgb*Min(Light_cone.vol_max, Light_cone.vol*power*(length/steps)), 0); } /******************************************************************************/ Vec4 Volumetric_PS(NOPERSP Vec2 inTex:TEXCOORD, uniform Bool add , uniform Int samples=6 ):COLOR { Vec vol=TexLod(Col, inTex).rgb; // use linear filtering because Col may be smaller UNROLL for(Int i=0; i