Texture2D DiffuseTexture; SamplerState DiffuseSampler; #ifdef USE_SECOND_TEXTURE Texture2D DiffuseTexture2; #endif #ifdef USE_ALPHA_MAP Texture2D AlphaTexture; #endif #ifdef USE_DEPTH_SOFTENING Texture2D DepthTexture; SamplerState DepthSampler; #endif struct VS_to_PS { float4 position : SV_POSITION; float4 texCoord0 : TEXCOORD0; float4 texCoord1 : TEXCOORD1; float4 viewPosition : TEXCOORD2; float4 mvpPosition : TEXCOORD3; float4 color : COLOR; }; #ifdef USE_DEPTH_SOFTENING cbuffer DepthBuffer { matrix cameraProjMatrix; float depthFadeDistance; float depthFadePower; }; float3 ComputeViewspaceDepth(float zBuffer) { return cameraProjMatrix._43 / (zBuffer - cameraProjMatrix._33); } #endif float4 UberParticlePixelShader(VS_to_PS input) : SV_TARGET { float4 outputColor = pow(DiffuseTexture.Sample(DiffuseSampler, input.texCoord0.xy), 2.2) * input.color; #ifdef USE_SECOND_TEXTURE outputColor *= pow(DiffuseTexture2.Sample(DiffuseSampler, input.texCoord0.zw), 2.2); #endif #ifdef USE_ALPHA_MAP outputColor.a *= AlphaTexture.Sample(DiffuseSampler, input.texCoord1.xy).r; #endif #ifdef USE_DEPTH_SOFTENING float2 screenPos = input.mvpPosition.xy / input.mvpPosition.w; screenPos = 0.5f * float2(screenPos.x, -screenPos.y) + 0.5; float depthViewPos = ComputeViewspaceDepth(DepthTexture.Sample(DepthSampler, screenPos).r); float viewDistance = abs(input.viewPosition.z - depthViewPos); outputColor.a *= pow(saturate(viewDistance / depthFadeDistance), depthFadePower); #endif outputColor.rgb *= input.texCoord1.z * outputColor.a; // material intensity return outputColor; }