Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

65 lines
2.5 KiB

//========== Copyright (c) Valve Corporation, All rights reserved. ==========//
#include "common_ps_fxc.h"
sampler FrontNDBuffer : register( s0 );
sampler AOTexture : register( s1 );
sampler RandomRotationSampler : register( s2 );
const float4 cScreenScale : register( c0 );
const float4 cNoiseOffset : register( c1 );
struct PS_INPUT
{
float2 tc : TEXCOORD0;
};
float ComputeWeight( float centerDepth, float neighborDepth )
{
return 1 - smoothstep( 0, 0.01, abs( centerDepth - neighborDepth ) );
}
float4 main( PS_INPUT i ) : COLOR
{
float2 rotOffset, texelSize = float2( 0.00078125f, 0.001388f );
float4 frontND = tex2D( FrontNDBuffer, i.tc ); // Front-facing Normal & Depth
float4 vJitter[16] = { float4( 0.0000f, 0.0000f, 0.8744f, 0.1665f), float4( 0.2329f, 0.3995f, -0.7804f, 0.5482f),
float4(-0.4577f, 0.7647f, -0.1936f, 0.5564f), float4( 0.4205f, -0.5768f, -0.0304f, -0.9050f),
float4(-0.5215f, 0.1854f, 0.3161f, -0.2954f), float4( 0.0666f, -0.5564f, -0.2137f, -0.0072f),
float4(-0.4112f, -0.3311f, 0.6438f, -0.2484f), float4(-0.9055f, -0.0360f, 0.8323f, 0.5268f),
float4( 0.5592f, 0.3459f, -0.6797f, -0.5201f), float4(-0.4325f, -0.8857f, 0.8768f, -0.4197f),
float4( 0.3090f, -0.8646f, 0.5034f, 0.8603f), float4( 0.3752f, 0.0627f, -0.0161f, 0.2627f),
float4( 0.0969f, 0.7054f, -0.2291f, -0.6595f), float4(-0.5887f, -0.1100f, 0.7048f, -0.6528f),
float4(-0.8438f, 0.2706f, -0.5061f, 0.4653f), float4(-0.1245f, -0.3302f, -0.1801f, 0.8486f) };
// 2D Rotation Matrix setup
float3 RMatTop = 0, RMatBottom = 0;
RMatTop.xy = tex2D( RandomRotationSampler, cScreenScale.xy * i.tc + cNoiseOffset.xy );
RMatBottom.xy = float2(-1.0, 1.0) * RMatTop.yx; // 2x2 rotation matrix in 4-tuple
RMatTop *= 3 * 0.00078125f; // Scale up kernel while accounting for texture resolution
RMatBottom *= 3 * 0.001388f;
RMatTop.z = i.tc.x; // To be added in d2adds generated below
RMatBottom.z = i.tc.y;
float aoAccum = 0.0f;
float weightAccum = 0.0f;
[unroll]
for( int j=0; j<16; j++ )
{
rotOffset.x = dot(RMatTop.xy, vJitter[j].xy) + RMatTop.z;
rotOffset.y = dot(RMatBottom.xy, vJitter[j].xy) + RMatBottom.z;
float d = tex2D( FrontNDBuffer, rotOffset ).a; // Depth of neighbor
float ao = tex2D( AOTexture, rotOffset ).r; // Ambient Occlusion at neighbor
aoAccum += ao;
weightAccum += ComputeWeight( frontND.a, d );
}
float result = aoAccum / weightAccum;
return float4( result.xxx, 1 );
}