Divergent/mods/Screen Space Shaders/gamedata/shaders/r3/deffer_base_hud_aref_bump.ps

126 lines
3.2 KiB
PostScript
Raw Normal View History

#if ( defined(MSAA_ALPHATEST_DX10_1_ATOC) || defined(MSAA_ALPHATEST_DX10_1) )
#define EXTEND_F_DEFFER
#endif
#include "common.h"
#include "sload.h"
#include "screenspace_hud_raindrops.h"
#include "check_screenspace.h"
#ifdef ATOC
float4 main ( p_bumped I ) : SV_Target
{
surface_bumped S = sload(I);
S.base.w = (S.base.w-def_aref*0.5f)/(1-def_aref*0.5f);
return S.base;
}
#else // ATOC
#ifdef MSAA_ALPHATEST_DX10_1_ATOC
f_deffer main ( p_bumped I, float4 pos2d : SV_Position )
#else // MSAA_ALPHATEST_DX10_1_ATOC
f_deffer main ( p_bumped I )
#endif // MSAA_ALPHATEST_DX10_1_ATOC
{
f_deffer O;
#if !defined(MSAA_ALPHATEST_DX10_1)
surface_bumped S = sload (I);
#if !( defined(MSAA_ALPHATEST_DX10_1_ATOC) || defined(MSAA_ALPHATEST_DX10_0_ATOC) )
clip (S.base.w-def_aref);
#endif // !( defined(MSAA_ALPHATEST_DX10_1_ATOC) || defined(MSAA_ALPHATEST_DX10_1_ATOC) )
#ifdef MSAA_ALPHATEST_DX10_1_ATOC
float alpha = (S.base.w-def_aref*0.5f)/(1-def_aref*0.5f);
uint mask = alpha_to_coverage ( alpha, pos2d );
#endif // MSAA_ALPHATEST_DX10_1_ATOC
#else // !defined(MSAA_ALPHATEST_DX10_1)
uint mask = 0x0;
surface_bumped S = sload (I,MSAAOffsets[0]*(1.0/16.0));
if( S.base.w-def_aref >= 0 ) mask |= 0x1;
[unroll] for( int i = 1; i < MSAA_SAMPLES; ++i )
{
surface_bumped SI = sload (I,MSAAOffsets[i]*(1.0/16.0));
if( SI.base.w-def_aref >= 0 ) mask |= ( uint(0x1) << i );
}
if( mask == 0x0 )
discard;
#endif // !defined(MSAA_ALPHATEST_DX10_1)
// HUD Rain drops - SSS Update 17
// https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders/
float4 drops = 0; // xy = Normal | z = Overall str | w = reflection str
if (ssfx_hud_drops_1.y > 0)
{
// Calc droplets
drops.xyz = ssfx_hud_raindrops(s_hud_rain, I.RDrops.xyz, 1.0f);
// Only apply to facing up surfaces [ World Y+ ]
drops.xyz *= saturate(I.RDrops.w);
// Intensity from script ( Cover + Rain intensity )
drops.xyz *= ssfx_hud_drops_1.y;
// Refraction
I.tcdh.xy = I.tcdh.xy + drops.xy * ssfx_hud_drops_1.w;
// Reflection adjustments
#ifdef SSFX_SSS
drops.w = ssfx_hud_drops_1.z;
#else
drops.w = ssfx_hud_drops_1.z * dot(L_hemi_color, SSFX_HUD_LIGHTVECTOR);
#endif
drops.w = max(drops.w, 3.0f);
}
// Sample normal, rotate it by matrix, encode position
float3 Ne = mul (float3x3(I.M1, I.M2, I.M3), S.normal + float3(drops.xy * drops.w, 1.0f));
Ne = normalize (Ne);
S.gloss += (ssfx_hud_drops_1.y * ssfx_hud_drops_2.z) + drops.z * ssfx_hud_drops_2.w;
// 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
#ifndef EXTEND_F_DEFFER
O = pack_gbuffer(
float4 (Ne, h),
float4 (I.position.xyz + Ne*S.height*def_virtualh, ms),
float4 (S.base.xyz, S.gloss));
#else
O = pack_gbuffer(
float4 (Ne, h),
float4 (I.position.xyz + Ne*S.height*def_virtualh, ms),
float4 (S.base.xyz, S.gloss),
mask );
#endif
return O ;
}
#endif // ATOC