117 lines
No EOL
3.4 KiB
PostScript
117 lines
No EOL
3.4 KiB
PostScript
#if ( defined(MSAA_ALPHATEST_DX10_1_ATOC) || defined(MSAA_ALPHATEST_DX10_1) )
|
|
#define EXTEND_F_DEFFER
|
|
#endif
|
|
|
|
#include "common.h"
|
|
#include "sload.h"
|
|
|
|
struct vf
|
|
{
|
|
float3 position : TEXCOORD0;
|
|
float2 tc0 : TEXCOORD1; // base0
|
|
float2 tc1 : TEXCOORD2; // base1
|
|
float4 af : COLOR1; // alpha&factor
|
|
float4 hpos : SV_Position;
|
|
};
|
|
|
|
void sample_Textures( inout float4 D, inout float4 H, float2 tc1, float2 tc0, float4 af, float2 pixeloffset )
|
|
{
|
|
float2 ddx_tc0 = ddx( tc0 );
|
|
float2 ddy_tc0 = ddy( tc0 );
|
|
float2 ddx_tc1 = ddx( tc1 );
|
|
float2 ddy_tc1 = ddy( tc1 );
|
|
|
|
float4 D1 = s_base.Sample( smp_base, tc1 + pixeloffset.x * ddx_tc1 + pixeloffset.y * ddy_tc1 );
|
|
float4 D0 = s_base.Sample( smp_base, tc0 + pixeloffset.x * ddx_tc0 + pixeloffset.y * ddy_tc0 );
|
|
float4 H0 = s_hemi.Sample( smp_linear, tc0 + pixeloffset.x * ddx_tc0 + pixeloffset.y * ddy_tc0 ); H0.xyz = H0.rgb*2-1; // expand
|
|
float4 H1 = s_hemi.Sample( smp_linear, tc1 + pixeloffset.x * ddx_tc1 + pixeloffset.y * ddy_tc1 ); H1.xyz = H1.rgb*2-1; // expand
|
|
|
|
D = lerp (D0,D1,af.w); D.w *= af.z; // multiply alpha
|
|
H = lerp (H0,H1,af.w); H.w *= af.x; // multiply hemi
|
|
}
|
|
|
|
#ifdef ATOC
|
|
|
|
float4 main ( vf I ) : SV_Target
|
|
{
|
|
float4 D;
|
|
float4 H;
|
|
sample_Textures(D, H, I.tc1, I.tc0, I.af, float2(0,0) );
|
|
D.w = (D.w-(96.h/255.h)*0.5)/(1-(96.h/255.h)*0.5);
|
|
return D.w;
|
|
}
|
|
|
|
#else // ATOC
|
|
|
|
#ifdef MSAA_ALPHATEST_DX10_1_ATOC
|
|
f_deffer main ( vf I, float4 pos2d : SV_Position )
|
|
#else // MSAA_ALPHATEST_DX10_1_ATOC
|
|
f_deffer main ( vf I )
|
|
#endif // MSAA_ALPHATEST_DX10_1_ATOC
|
|
{
|
|
f_deffer O;
|
|
|
|
// 1. Base texture + kill pixels with low alpha
|
|
// float4 D0 = tex2D (s_base, I.tc0);
|
|
// float4 D1 = tex2D (s_base, I.tc1);
|
|
// float4 H0 = tex2D (s_hemi, I.tc0); H0.xyz = H0.rgb*2-1; // expand
|
|
// float4 H1 = tex2D (s_hemi, I.tc1); H1.xyz = H1.rgb*2-1; // expand
|
|
float4 D;
|
|
float4 H;
|
|
|
|
#if !defined(MSAA_ALPHATEST_DX10_1)
|
|
sample_Textures(D, H, I.tc1, I.tc0, I.af, float2(0,0));
|
|
|
|
#if !( defined(MSAA_ALPHATEST_DX10_1_ATOC) || defined(MSAA_ALPHATEST_DX10_0_ATOC) )
|
|
clip (D.w-(96.h/255.h)) ;
|
|
#endif // !( defined(MSAA_ALPHATEST_DX10_1_ATOC) || defined(MSAA_ALPHATEST_DX10_1_ATOC) )
|
|
#ifdef MSAA_ALPHATEST_DX10_1_ATOC
|
|
float alpha = (D.w-(96.h/255.h)*0.5)/(1-(96.h/255.h)*0.5);
|
|
uint mask = alpha_to_coverage ( alpha, pos2d );
|
|
#endif // MSAA_ALPHATEST_DX10_1_ATOC
|
|
|
|
#else
|
|
uint mask = 0x0;
|
|
|
|
float2 pixeloffset = MSAAOffsets[0]*(1.0/16.0);
|
|
|
|
sample_Textures(D, H, I.tc1, I.tc0, I.af, pixeloffset );
|
|
|
|
if( D.w-(96.h/255.h) >= 0 ) mask |= 0x1;
|
|
|
|
[unroll] for( int i = 1; i < MSAA_SAMPLES; ++i )
|
|
{
|
|
float4 DI;
|
|
float4 HI;
|
|
pixeloffset = MSAAOffsets[i]*(1.0/16.0);
|
|
sample_Textures(DI, HI, I.tc1, I.tc0, I.af, pixeloffset );
|
|
if( DI.w-(96.h/255.h) >= 0 ) mask |= ( uint(0x1) << i );
|
|
}
|
|
|
|
if( mask == 0x0 )
|
|
discard;
|
|
|
|
#endif
|
|
|
|
float3 N = normalize (H.xyz);
|
|
|
|
// D.xyz = float3(1,0,0);
|
|
|
|
// 2. Standart output
|
|
#ifndef EXTEND_F_DEFFER
|
|
O = pack_gbuffer(
|
|
float4 (N , H.w ),
|
|
float4 (I.position + N*def_virtualh/2.h , 0 ),
|
|
float4 (D.x, D.y, D.z , def_gloss ) ); // OUT: rgb.gloss
|
|
#else
|
|
O = pack_gbuffer(
|
|
float4 (N , H.w ),
|
|
float4 (I.position + N*def_virtualh/2.h , 0 ),
|
|
float4 (D.x, D.y, D.z , def_gloss ),
|
|
mask ); // OUT: rgb.gloss
|
|
#endif
|
|
|
|
return O;
|
|
}
|
|
|
|
#endif // ATOC |