108 lines
2.6 KiB
PostScript
108 lines
2.6 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"
|
|
|
|
#ifdef ATOC
|
|
|
|
float4 main ( p_flat I ) : SV_Target
|
|
{
|
|
float4 D = s_base.Sample (smp_linear, I.tcdh); //tbase (I.tcdh);
|
|
D.w = (D.w-def_aref*0.5f)/(1-def_aref*0.5f);
|
|
return D;
|
|
}
|
|
|
|
#else // ATOC
|
|
|
|
#ifdef MSAA_ALPHATEST_DX10_1_ATOC
|
|
f_deffer main ( p_flat I, float4 pos2d : SV_Position )
|
|
#else // MSAA_ALPHATEST_DX10_1_ATOC
|
|
f_deffer main ( p_flat I )
|
|
#endif // MSAA_ALPHATEST_DX10_1_ATOC
|
|
{
|
|
f_deffer O;
|
|
|
|
// 1. Base texture + kill pixels with low alpha
|
|
|
|
#if !defined(MSAA_ALPHATEST_DX10_1)
|
|
|
|
float4 D = tbase (I.tcdh);
|
|
|
|
#if !( defined(MSAA_ALPHATEST_DX10_1_ATOC) || defined(MSAA_ALPHATEST_DX10_0_ATOC) )
|
|
clip (D.w-def_aref);
|
|
#endif // !( defined(MSAA_ALPHATEST_DX10_1_ATOC) || defined(MSAA_ALPHATEST_DX10_1_ATOC) )
|
|
#ifdef MSAA_ALPHATEST_DX10_1_ATOC
|
|
float alpha = (D.w-def_aref*0.5f)/(1-def_aref*0.5f);
|
|
uint mask = alpha_to_coverage ( alpha, pos2d );
|
|
#endif // MSAA_ALPHATEST_DX10_1_ATOC
|
|
|
|
#else
|
|
uint mask = 0x0;
|
|
float2 ddx_base = ddx( I.tcdh );
|
|
float2 ddy_base = ddy( I.tcdh );
|
|
|
|
float2 pixeloffset = MSAAOffsets[0]*(1.0/16.0);
|
|
|
|
float2 texeloffset = pixeloffset.x * ddx_base + pixeloffset.y * ddy_base;
|
|
|
|
float4 D = tbase(I.tcdh+texeloffset);
|
|
|
|
if( D.w-def_aref >= 0 ) mask |= 0x1;
|
|
|
|
[unroll] for( int i = 1; i < MSAA_SAMPLES; ++i )
|
|
{
|
|
pixeloffset = MSAAOffsets[i]*(1.0/16.0);
|
|
texeloffset = pixeloffset.x * ddx_base + pixeloffset.y * ddy_base;
|
|
float4 DI = tbase(I.tcdh+texeloffset);
|
|
if( DI.w-def_aref >= 0 ) mask |= ( uint(0x1) << i );
|
|
}
|
|
|
|
if( mask == 0x0 )
|
|
discard;
|
|
#endif
|
|
|
|
#ifdef USE_TDETAIL
|
|
// D.rgb = 2*D.rgb*tex2D (s_detail, I.tcdbump).rgb;
|
|
D.rgb = 2*D.rgb * s_detail.Sample( smp_base, I.tcdbump ).rgb;
|
|
#endif
|
|
|
|
// hemi,sun,material
|
|
float ms = xmaterial ;
|
|
#ifdef USE_LM_HEMI
|
|
// float4 lm = tex2D (s_hemi, I.lmh);
|
|
float4 lm = s_hemi.Sample( smp_rtlinear, I.lmh);
|
|
// float h = dot (lm.rgb,1.h/3.h);
|
|
float h = get_hemi(lm);
|
|
# ifdef USE_R2_STATIC_SUN
|
|
// ms = lm.w ;
|
|
ms = get_sun(lm);
|
|
# endif
|
|
#else
|
|
float h = I.position.w ;
|
|
# ifdef USE_R2_STATIC_SUN
|
|
ms = I.tcdh.w ;
|
|
# endif
|
|
#endif
|
|
|
|
// 2. Standart output
|
|
float4 Ne = float4(normalize((float3)I.N.xyz), h);
|
|
|
|
#if !( defined(MSAA_ALPHATEST_DX10_1_ATOC) || defined(MSAA_ALPHATEST_DX10_1) )
|
|
O = pack_gbuffer(
|
|
Ne,
|
|
float4(I.position.xyz + Ne.xyz*def_virtualh/2.h, ms),
|
|
float4(D.rgb, def_gloss));
|
|
#else
|
|
O = pack_gbuffer(
|
|
Ne,
|
|
float4(I.position.xyz + Ne.xyz*def_virtualh/2.h, ms),
|
|
float4(D.rgb, def_gloss),
|
|
mask );
|
|
#endif
|
|
return O;
|
|
}
|
|
|
|
#endif // ATOC
|