|
|
//========== Copyright (c) Valve Corporation, All rights reserved. ==========//
// STATIC: "VERTEXCOLOR" "0..1" // STATIC: "BUMPMAP" "0..2"
// DYNAMIC: "NUM_LIGHTS" "0..4" [ps20b] // DYNAMIC: "NUM_LIGHTS" "0..4" [ps30] // DYNAMIC: "AMBIENT_LIGHT" "0..1"
// Includes ======================================================================================= #include "common_vertexlitgeneric_dx9.h"
// Texture Samplers =============================================================================== sampler g_tColorSampler : register( s0 ); sampler g_tBumpSampler : register( s1 ); sampler g_tDummySampler : register( s2 );
// Shaders Constants and Globals ================================================================== const float4 g_mViewProj0 : register( c0 ); // 1st row of matrix const float4 g_mViewProj1 : register( c1 ); // 2nd row of matrix const float4 g_vCameraPosition : register( c2 ); const float3 g_ambientCube[6] : register( c3 ); //: register( c4 ); //: register( c5 ); //: register( c6 ); //: register( c7 ); //: register( c8 );
PixelShaderLightInfo g_lightInfo[3] : register( c9 ); // 2 registers each - 6 registers total //: register( c10 ); //: register( c11 ); //: register( c12 ); //: register( c13 ); //: register( c14 );
// new-UP static const float3 upBumpBasis[3] = { float3( 0.0f, 0.81649661064147949f, OO_SQRT_3 ), float3( -0.70710676908493042f, -0.40824833512306213f, OO_SQRT_3 ), float3( 0.7071068286895752f, -0.40824821591377258f, OO_SQRT_3 ) };
// Interpolated values ============================================================================ struct PS_INPUT { float3 vUv0 : TEXCOORD0; float3 vWorldNormal : TEXCOORD1; float3 vWorldTangent : TEXCOORD2; float3 vWorldBinormal : TEXCOORD3; float3 vWorldPosition : TEXCOORD4; float4 vLightAtten : TEXCOORD5; float4 vSpecularPack1 : TEXCOORD6; float4 vSpecularPack2 : TEXCOORD7; #if ( VERTEXCOLOR ) float4 vVertexColor : COLOR0; #endif };
// Main =========================================================================================== float4 main( PS_INPUT i ) : COLOR { // Unpack lighting information float3 vSpecularN1 = i.vSpecularPack1.xyz; float3 vSpecularN2 = i.vSpecularPack2.xyz; float3 vSpecularN3; vSpecularN3.x = i.vSpecularPack1.w; vSpecularN3.y = i.vSpecularPack2.w; vSpecularN3.z = i.vUv0.z;
// Color float4 cBaseColor = tex2D( g_tColorSampler, i.vUv0.xy );
#if BUMPMAP == 0 // non-bumped case float3 vTangentNormal = float3( 0, 0, 1 ); #elif BUMPMAP == 1 // Combine bump layers into tangent normal float4 vBumpTexel = tex2D( g_tBumpSampler, i.vUv0.xy ); float3 vTangentNormal = ( vBumpTexel * 2.0f ) - 1.0f; #elif BUMPMAP == 2 // ssbump case float4 vBumpTexel = tex2D( g_tBumpSampler, i.vUv0.xy ); float3 vTangentNormal = vBumpTexel; #endif
// Lighting float3 cDiffuse = float3( 0.0f, 0.0f, 0.0f ); #if ( VERTEXCOLOR ) { // Use interpolated vertex colors cDiffuse.rgb = i.vVertexColor.rgb; } #else { // Compute lighting // cDiffuse.rgb = PixelShaderDoLighting( i.vWorldPosition.xyz, normalize( vWorldNormal.xyz ), // float3( 0.0f, 0.0f, 0.0f ), false, AMBIENT_LIGHT, i.vLightAtten.xyzw, // g_ambientCube, g_tDummySampler, NUM_LIGHTS, g_lightInfo, false, // false, g_tDummySampler ); #if BUMPMAP == 0 cDiffuse.rgb = ( vSpecularN1 + vSpecularN2 + vSpecularN3 ) / 3.0f; #elif BUMPMAP == 1 float3 dp; dp.x = saturate( dot( vTangentNormal, upBumpBasis[0] ) ); dp.y = saturate( dot( vTangentNormal, upBumpBasis[1] ) ); dp.z = saturate( dot( vTangentNormal, upBumpBasis[2] ) ); dp *= dp;
cDiffuse.rgb = dp.x * vSpecularN1 + dp.y * vSpecularN2 + dp.z * vSpecularN3; #elif BUMPMAP == 2 float3 dp; dp.x = saturate( dot( vTangentNormal, upBumpBasis[0] ) ); dp.y = saturate( dot( vTangentNormal, upBumpBasis[1] ) ); dp.z = saturate( dot( vTangentNormal, upBumpBasis[2] ) ); dp *= dp;
cDiffuse.rgb = dp.x * vSpecularN1 + dp.y * vSpecularN2 + dp.z * vSpecularN3;
// ssbump case needs to construct tangent normal from ssbump vector vTangentNormal.xyz = normalize( bumpBasis[0]*vTangentNormal.x + bumpBasis[1]*vTangentNormal.y + bumpBasis[2]*vTangentNormal.z); #endif } #endif
#if 0 // Transform normal into world space float3 vWorldNormal = Vec3TangentToWorld( vTangentNormal.xyz, i.vWorldNormal.xyz, i.vWorldTangent.xyz, i.vWorldBinormal.xyz ); #endif
//===============// // Combine terms // //===============// float4 result; result.rgb = cBaseColor.rgb; result.rgb *= cDiffuse.rgb;
// Set alpha to... result.a = 0.0f;
return FinalOutput( result, 0, PIXEL_FOG_TYPE_NONE, TONEMAP_SCALE_LINEAR ); //go back to final output when it'll fit. }
|