{ parms { stageSort sortTrans alphaScale.y 1.0 / alphaScale.x } state { blend GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA depthmask } hlsl_vp { result.position.x = dot4( vertex.position, $mvpMatrixX ); result.position.y = dot4( vertex.position, $mvpMatrixY ); result.position.z = dot4( vertex.position, $mvpMatrixZ ); result.position.w = dot4( vertex.position, $mvpMatrixW ); result.texcoord0.x = dot4( vertex.texcoord0, $sMatrix ); result.texcoord0.y = dot4( vertex.texcoord0, $tMatrix ); result.texcoord0.zw = _float2( 0.0 ); // result.texcoord0.w = -( clamp( result.position.w - $fogStart.x, 0.0, $fogEnd.x ) * $fogScale.x ); // Fade particle based on distance to near clip float fade = saturate( abs( result.position.w ) * $particleFade.x ); result.color = $color; result.color.w *= fade; #ifdef XBOX result.texcoord1 = result.position; #endif } hlsl_fp { #ifdef XBOX float interpolatedZOverW = fragment.texcoord1.z / fragment.texcoord1.w; #else float interpolatedZOverW = fragment.position.z; #endif float2 tc = screenPosToTexcoord( fragment.position.xy, $renderPositionToViewTexture ); float scale = ComputeSoftParticleScale( $viewDepthMap, tc, interpolatedZOverW, $alphaScale.y ); half4 final = tex2D( $transMap, fragment.texcoord0.xy ) * fragment.color; // Apply global fog //half fog = saturate( exp2( fragment.texcoord0.w ) ); //final.xyz = lerp( $fogColor.xyz, final.xyz, fog ); result.color = final; result.color.xyz *= $brightnessScale.xyz; result.color.w *= scale; } }