|
@@ -20,22 +20,23 @@
|
|
// IN THE SOFTWARE.
|
|
// IN THE SOFTWARE.
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
-#include "shadergen:/autogenConditioners.h"
|
|
|
|
|
|
+#include "../../shaderModel.hlsl"
|
|
|
|
+#include "../../shaderModelAutoGen.hlsl"
|
|
|
|
|
|
// These are set by the game engine.
|
|
// These are set by the game engine.
|
|
// The render target size is one-quarter the scene rendering size.
|
|
// The render target size is one-quarter the scene rendering size.
|
|
-uniform sampler2D colorSampler : register(S0);
|
|
|
|
-uniform sampler2D depthSampler : register(S1);
|
|
|
|
-uniform float2 dofEqWorld;
|
|
|
|
-uniform float depthOffset;
|
|
|
|
|
|
+TORQUE_UNIFORM_SAMPLER2D(colorSampler, 0);
|
|
|
|
+TORQUE_UNIFORM_SAMPLER2D(depthSampler, 1);
|
|
|
|
+uniform float2 dofEqWorld;
|
|
uniform float2 targetSize;
|
|
uniform float2 targetSize;
|
|
|
|
+uniform float depthOffset;
|
|
uniform float maxWorldCoC;
|
|
uniform float maxWorldCoC;
|
|
//uniform float2 dofEqWeapon;
|
|
//uniform float2 dofEqWeapon;
|
|
//uniform float2 dofRowDelta; // float2( 0, 0.25 / renderTargetHeight )
|
|
//uniform float2 dofRowDelta; // float2( 0, 0.25 / renderTargetHeight )
|
|
|
|
|
|
struct Pixel
|
|
struct Pixel
|
|
{
|
|
{
|
|
- float4 position : POSITION;
|
|
|
|
|
|
+ float4 position : TORQUE_POSITION;
|
|
float2 tcColor0 : TEXCOORD0;
|
|
float2 tcColor0 : TEXCOORD0;
|
|
float2 tcColor1 : TEXCOORD1;
|
|
float2 tcColor1 : TEXCOORD1;
|
|
float2 tcDepth0 : TEXCOORD2;
|
|
float2 tcDepth0 : TEXCOORD2;
|
|
@@ -44,7 +45,7 @@ struct Pixel
|
|
float2 tcDepth3 : TEXCOORD5;
|
|
float2 tcDepth3 : TEXCOORD5;
|
|
};
|
|
};
|
|
|
|
|
|
-half4 main( Pixel IN ) : COLOR
|
|
|
|
|
|
+half4 main( Pixel IN ) : TORQUE_TARGET0
|
|
{
|
|
{
|
|
//return float4( 1.0, 0.0, 1.0, 1.0 );
|
|
//return float4( 1.0, 0.0, 1.0, 1.0 );
|
|
|
|
|
|
@@ -69,57 +70,64 @@ half4 main( Pixel IN ) : COLOR
|
|
|
|
|
|
// Use bilinear filtering to average 4 color samples for free.
|
|
// Use bilinear filtering to average 4 color samples for free.
|
|
color = 0;
|
|
color = 0;
|
|
- color += tex2D( colorSampler, IN.tcColor0.xy + rowOfs[0] ).rgb;
|
|
|
|
- color += tex2D( colorSampler, IN.tcColor1.xy + rowOfs[0] ).rgb;
|
|
|
|
- color += tex2D( colorSampler, IN.tcColor0.xy + rowOfs[2] ).rgb;
|
|
|
|
- color += tex2D( colorSampler, IN.tcColor1.xy + rowOfs[2] ).rgb;
|
|
|
|
|
|
+ color += half3(TORQUE_TEX2D( colorSampler, IN.tcColor0.xy + rowOfs[0] ).rgb);
|
|
|
|
+ color += half3(TORQUE_TEX2D(colorSampler, IN.tcColor1.xy + rowOfs[0]).rgb);
|
|
|
|
+ color += half3(TORQUE_TEX2D(colorSampler, IN.tcColor0.xy + rowOfs[2]).rgb);
|
|
|
|
+ color += half3(TORQUE_TEX2D(colorSampler, IN.tcColor1.xy + rowOfs[2]).rgb);
|
|
color /= 4;
|
|
color /= 4;
|
|
|
|
|
|
|
|
+ //declare thse here to save doing it in each loop below
|
|
|
|
+ half4 zero4 = half4(0, 0, 0, 0);
|
|
|
|
+ coc = zero4;
|
|
|
|
+ half4 dofEqWorld4X = half4(dofEqWorld.xxxx);
|
|
|
|
+ half4 dofEqWorld4Y = half4(dofEqWorld.yyyy);
|
|
|
|
+ half4 maxWorldCoC4 = half4(maxWorldCoC, maxWorldCoC, maxWorldCoC, maxWorldCoC);
|
|
// Process 4 samples at a time to use vector hardware efficiently.
|
|
// Process 4 samples at a time to use vector hardware efficiently.
|
|
// The CoC will be 1 if the depth is negative, so use "min" to pick
|
|
// The CoC will be 1 if the depth is negative, so use "min" to pick
|
|
- // between "sceneCoc" and "viewCoc".
|
|
|
|
-
|
|
|
|
- for ( int i = 0; i < 4; i++ )
|
|
|
|
|
|
+ // between "sceneCoc" and "viewCoc".
|
|
|
|
+ [unroll] // coc[i] causes this anyway
|
|
|
|
+ for (int i = 0; i < 4; i++)
|
|
{
|
|
{
|
|
- depth[0] = prepassUncondition( depthSampler, float4( IN.tcDepth0.xy + rowOfs[i], 0, 0 ) ).w;
|
|
|
|
- depth[1] = prepassUncondition( depthSampler, float4( IN.tcDepth1.xy + rowOfs[i], 0, 0 ) ).w;
|
|
|
|
- depth[2] = prepassUncondition( depthSampler, float4( IN.tcDepth2.xy + rowOfs[i], 0, 0 ) ).w;
|
|
|
|
- depth[3] = prepassUncondition( depthSampler, float4( IN.tcDepth3.xy + rowOfs[i], 0, 0 ) ).w;
|
|
|
|
- coc[i] = clamp( dofEqWorld.x * depth + dofEqWorld.y, 0.0, maxWorldCoC );
|
|
|
|
- }
|
|
|
|
|
|
+ depth[0] = TORQUE_PREPASS_UNCONDITION(depthSampler, (IN.tcDepth0.xy + rowOfs[i])).w;
|
|
|
|
+ depth[1] = TORQUE_PREPASS_UNCONDITION(depthSampler, (IN.tcDepth1.xy + rowOfs[i])).w;
|
|
|
|
+ depth[2] = TORQUE_PREPASS_UNCONDITION(depthSampler, (IN.tcDepth2.xy + rowOfs[i])).w;
|
|
|
|
+ depth[3] = TORQUE_PREPASS_UNCONDITION(depthSampler, (IN.tcDepth3.xy + rowOfs[i])).w;
|
|
|
|
+
|
|
|
|
+ coc = max(coc, clamp(dofEqWorld4X * half4(depth)+dofEqWorld4Y, zero4, maxWorldCoC4));
|
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
/*
|
|
- depth[0] = tex2D( depthSampler, pixel.tcDepth0.xy + rowOfs[0] ).r;
|
|
|
|
- depth[1] = tex2D( depthSampler, pixel.tcDepth1.xy + rowOfs[0] ).r;
|
|
|
|
- depth[2] = tex2D( depthSampler, pixel.tcDepth2.xy + rowOfs[0] ).r;
|
|
|
|
- depth[3] = tex2D( depthSampler, pixel.tcDepth3.xy + rowOfs[0] ).r;
|
|
|
|
|
|
+ depth[0] = TORQUE_TEX2D( depthSampler, pixel.tcDepth0.xy + rowOfs[0] ).r;
|
|
|
|
+ depth[1] = TORQUE_TEX2D( depthSampler, pixel.tcDepth1.xy + rowOfs[0] ).r;
|
|
|
|
+ depth[2] = TORQUE_TEX2D( depthSampler, pixel.tcDepth2.xy + rowOfs[0] ).r;
|
|
|
|
+ depth[3] = TORQUE_TEX2D( depthSampler, pixel.tcDepth3.xy + rowOfs[0] ).r;
|
|
viewCoc = saturate( dofEqWeapon.x * -depth + dofEqWeapon.y );
|
|
viewCoc = saturate( dofEqWeapon.x * -depth + dofEqWeapon.y );
|
|
sceneCoc = saturate( dofEqWorld.x * depth + dofEqWorld.y );
|
|
sceneCoc = saturate( dofEqWorld.x * depth + dofEqWorld.y );
|
|
curCoc = min( viewCoc, sceneCoc );
|
|
curCoc = min( viewCoc, sceneCoc );
|
|
coc = curCoc;
|
|
coc = curCoc;
|
|
|
|
|
|
- depth[0] = tex2D( depthSampler, pixel.tcDepth0.xy + rowOfs[1] ).r;
|
|
|
|
- depth[1] = tex2D( depthSampler, pixel.tcDepth1.xy + rowOfs[1] ).r;
|
|
|
|
- depth[2] = tex2D( depthSampler, pixel.tcDepth2.xy + rowOfs[1] ).r;
|
|
|
|
- depth[3] = tex2D( depthSampler, pixel.tcDepth3.xy + rowOfs[1] ).r;
|
|
|
|
|
|
+ depth[0] = TORQUE_TEX2D( depthSampler, pixel.tcDepth0.xy + rowOfs[1] ).r;
|
|
|
|
+ depth[1] = TORQUE_TEX2D( depthSampler, pixel.tcDepth1.xy + rowOfs[1] ).r;
|
|
|
|
+ depth[2] = TORQUE_TEX2D( depthSampler, pixel.tcDepth2.xy + rowOfs[1] ).r;
|
|
|
|
+ depth[3] = TORQUE_TEX2D( depthSampler, pixel.tcDepth3.xy + rowOfs[1] ).r;
|
|
viewCoc = saturate( dofEqWeapon.x * -depth + dofEqWeapon.y );
|
|
viewCoc = saturate( dofEqWeapon.x * -depth + dofEqWeapon.y );
|
|
sceneCoc = saturate( dofEqWorld.x * depth + dofEqWorld.y );
|
|
sceneCoc = saturate( dofEqWorld.x * depth + dofEqWorld.y );
|
|
curCoc = min( viewCoc, sceneCoc );
|
|
curCoc = min( viewCoc, sceneCoc );
|
|
coc = max( coc, curCoc );
|
|
coc = max( coc, curCoc );
|
|
|
|
|
|
- depth[0] = tex2D( depthSampler, pixel.tcDepth0.xy + rowOfs[2] ).r;
|
|
|
|
- depth[1] = tex2D( depthSampler, pixel.tcDepth1.xy + rowOfs[2] ).r;
|
|
|
|
- depth[2] = tex2D( depthSampler, pixel.tcDepth2.xy + rowOfs[2] ).r;
|
|
|
|
- depth[3] = tex2D( depthSampler, pixel.tcDepth3.xy + rowOfs[2] ).r;
|
|
|
|
|
|
+ depth[0] = TORQUE_TEX2D( depthSampler, pixel.tcDepth0.xy + rowOfs[2] ).r;
|
|
|
|
+ depth[1] = TORQUE_TEX2D( depthSampler, pixel.tcDepth1.xy + rowOfs[2] ).r;
|
|
|
|
+ depth[2] = TORQUE_TEX2D( depthSampler, pixel.tcDepth2.xy + rowOfs[2] ).r;
|
|
|
|
+ depth[3] = TORQUE_TEX2D( depthSampler, pixel.tcDepth3.xy + rowOfs[2] ).r;
|
|
viewCoc = saturate( dofEqWeapon.x * -depth + dofEqWeapon.y );
|
|
viewCoc = saturate( dofEqWeapon.x * -depth + dofEqWeapon.y );
|
|
sceneCoc = saturate( dofEqWorld.x * depth + dofEqWorld.y );
|
|
sceneCoc = saturate( dofEqWorld.x * depth + dofEqWorld.y );
|
|
curCoc = min( viewCoc, sceneCoc );
|
|
curCoc = min( viewCoc, sceneCoc );
|
|
coc = max( coc, curCoc );
|
|
coc = max( coc, curCoc );
|
|
|
|
|
|
- depth[0] = tex2D( depthSampler, pixel.tcDepth0.xy + rowOfs[3] ).r;
|
|
|
|
- depth[1] = tex2D( depthSampler, pixel.tcDepth1.xy + rowOfs[3] ).r;
|
|
|
|
- depth[2] = tex2D( depthSampler, pixel.tcDepth2.xy + rowOfs[3] ).r;
|
|
|
|
- depth[3] = tex2D( depthSampler, pixel.tcDepth3.xy + rowOfs[3] ).r;
|
|
|
|
|
|
+ depth[0] = TORQUE_TEX2D( depthSampler, pixel.tcDepth0.xy + rowOfs[3] ).r;
|
|
|
|
+ depth[1] = TORQUE_TEX2D( depthSampler, pixel.tcDepth1.xy + rowOfs[3] ).r;
|
|
|
|
+ depth[2] = TORQUE_TEX2D( depthSampler, pixel.tcDepth2.xy + rowOfs[3] ).r;
|
|
|
|
+ depth[3] = TORQUE_TEX2D( depthSampler, pixel.tcDepth3.xy + rowOfs[3] ).r;
|
|
viewCoc = saturate( dofEqWeapon.x * -depth + dofEqWeapon.y );
|
|
viewCoc = saturate( dofEqWeapon.x * -depth + dofEqWeapon.y );
|
|
sceneCoc = saturate( dofEqWorld.x * depth + dofEqWorld.y );
|
|
sceneCoc = saturate( dofEqWorld.x * depth + dofEqWorld.y );
|
|
curCoc = min( viewCoc, sceneCoc );
|
|
curCoc = min( viewCoc, sceneCoc );
|