home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar 2006 April
/
Gamestar_83_2006-04_dvd.iso
/
Dema
/
demowot_english.exe
/
InfDX
/
x
/
backup
/
deferred-point-pixel.hlsl
next >
Wrap
Text File
|
2005-03-22
|
2KB
|
71 lines
struct VS_OUTPUT
{
float4 Transformed : TEXCOORD0;
float4 Attrib : TEXCOORD1;
float4 Color : TEXCOORD2;
float3 LightInView : TEXCOORD3;
float4 FustrumPos : TEXCOORD4;
float4 ViewToLight0 : TEXCOORD5;
float4 ViewToLight1 : TEXCOORD6;
float4 ViewToLight2 : TEXCOORD7;
};
float4x4 TDX_CONST_INVPROJ;
float4x4 TDX_CONST_INVVIEW;
float4x4 TDX_CONST_INVVIEWPROJ;
float4 TDX_CONST_LIGHTCONTRIB;
sampler sampler_albedo : register(s0); // albedo
sampler sampler_normal : register(s1); // normal
sampler sampler_position : register(s2); // position
sampler sampler_projector : register(s3); // projector
sampler sampler_specular : register(s4); // specular exp
float4 main(VS_OUTPUT In) : COLOR
{
float4 FinalColor;
// albedo color
float4 Albedo=tex2Dproj(sampler_albedo, In.Transformed);
// normalvector
float4 Normal=tex2Dproj(sampler_normal, In.Transformed)*2-1;
// extracting view space position
float4 Depth=tex2Dproj(sampler_position, In.Transformed);
float3 ViewSpacePos=(In.FustrumPos/In.FustrumPos.w)*Depth.r;
// lighting parameters
float3 LightToFragment=ViewSpacePos-In.LightInView;
float Distance=length(LightToFragment);
float3 LightToFragmentNorm=LightToFragment/Distance;
float Attenuation=saturate(1-(Distance*In.Attrib.x));
float4 Factor=Attenuation*In.Color;
float DotProduct=saturate(dot(Normal, -LightToFragmentNorm));
FinalColor.rgb=DotProduct*Factor;
#if TDX_SHADERFLAG_SPECULAR
float3 Reflected=normalize(reflect(ViewSpacePos, Normal.xyz));
#if 0
float Specular=pow(saturate(dot(Reflected, -LightToFragmentNorm)),Normal.w*100);
#else
float Specular=tex2D(sampler_specular, float2(dot(Reflected, -LightToFragmentNorm), Normal.w)).a;
#endif
FinalColor.rgb+=Factor*Specular*Albedo.a;
#endif
float3 LightToFragmentLS;
LightToFragmentLS.x=mul(LightToFragmentNorm, In.ViewToLight0);
LightToFragmentLS.y=mul(LightToFragmentNorm, In.ViewToLight1);
LightToFragmentLS.z=mul(LightToFragmentNorm, In.ViewToLight2);
FinalColor.rgb*=texCUBE(sampler_projector, LightToFragmentLS);
FinalColor.a=dot((float3)FinalColor.rgb,(float3)TDX_CONST_LIGHTCONTRIB);
FinalColor.rgb*=Albedo;
return FinalColor;
}