⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 water_ps20.fxc

📁 hl2 source code. Do not use it illegal.
💻 FXC
字号:
// STATIC: "REFLECT" "0..1"
// STATIC: "REFRACT" "0..1"
#include "common_ps_fxc.h"

sampler RefractSampler	: register( s2 );
sampler ReflectSampler	: register( s4 );
sampler NormalSampler	: register( s3 );

sampler NormalizeSampler : register( s6 );

const HALF4 vRefractTint : register( c1 );
const HALF4 vReflectTint : register( c4 );
const float4  g_ReflectRefractScale : register( c5 ); // xy - reflect scale, zw - refract scale

static const bool g_bReflect = REFLECT ? true : false;
static const bool g_bRefract = REFRACT ? true : false;

struct PS_INPUT
{
	float2 vBumpTexCoord			: TEXCOORD0;
	HALF3 vTangentEyeVect		: TEXCOORD1;
	float4 vReflectXY_vRefractYX : TEXCOORD2;
	float  W                     : TEXCOORD3;
};

HALF4 main( PS_INPUT i ) : COLOR
{
	// Load normal and expand range
	HALF4 vNormalSample = tex2D( NormalSampler, i.vBumpTexCoord );
	HALF3 vNormal = vNormalSample * 2.0 - 1.0;

	// Perform division by W only once
	float ooW = 1.0f / i.W;

	// Compute coordinates for sampling Reflection
	float2 vReflectTexCoord;
	float2 vRefractTexCoord;

	// vectorize the dependent UV calculations (reflect = .xy, refract = .wz)
#ifdef NV3X
	float4 vDependentTexCoords = vNormal.xyxy * vNormalSample.a * g_ReflectRefractScale;
#else
	float4 vN;
	vN.xy = vNormal.xy;
	vN.w = vNormal.x;
	vN.z = vNormal.y;
	float4 vDependentTexCoords = vN * vNormalSample.a * g_ReflectRefractScale;
#endif
	vDependentTexCoords += ( i.vReflectXY_vRefractYX * ooW );
	vReflectTexCoord = vDependentTexCoords.xy;
	vRefractTexCoord = vDependentTexCoords.wz;

	// Sample reflection and refraction
	HALF4 vReflectColor = tex2D( ReflectSampler, vReflectTexCoord ) * vReflectTint;
	HALF4 vRefractColor = tex2D( RefractSampler, vRefractTexCoord ) * vRefractTint;
	
	HALF3 vEyeVect;
	vEyeVect = texCUBE( NormalizeSampler, i.vTangentEyeVect );
	vEyeVect = vEyeVect * 2.0 - 1.0;

	// Fresnel term
	HALF fNdotV = saturate( dot( vEyeVect, vNormal ) );
	HALF fFresnel = pow( 1.0 - fNdotV, 5 );

	if( g_bReflect && g_bRefract )
	{
		return lerp( vRefractColor, vReflectColor, fFresnel );
	}
	else if( g_bReflect )
	{
		return vReflectColor;
	}
	else if( g_bRefract )
	{
		return vRefractColor;
	}
	else
	{
		return float4( 0.0f, 0.0f, 0.0f, 0.0f );
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -