half-life 2 / valve source · pdf filehalf-life® 2 / valve source™ shading 22 march...
TRANSCRIPT
![Page 1: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/1.jpg)
Half-Life® 2 / Valve Source™ Shading
22 MARCH 2004 / Gary McTaggart
©2004 Valve Corporation. All rights reserved. Valve, the Valve logo, Half-Life, the Half-Life logo, the Lambda logo,Valve Source and the Source logo are trademarks and/or registered trademarks of Valve Corporation.
![Page 2: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/2.jpg)
Outline• “Radiosity Normal Mapping”• World Geometry pixel shading
– Lighting equation– Managing shader permutations
• Model Geometry vertex shading• Reflection and Refraction
![Page 3: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/3.jpg)
Why Radiosity?• Realism• Avoids harsh lighting• Less micro-management of light
sources for content production• Can’t tune lights shot-by-shot like
movies. Don’t know what the shots are, and don’t want to take the production time to do this.
![Page 4: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/4.jpg)
Direct lighting onlyDirect lighting only
![Page 5: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/5.jpg)
Radiosity lightingRadiosity lighting
![Page 6: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/6.jpg)
Why normal-mapping?• Reusable high-frequency detail• Higher detail than we can currently
get from triangles• Works well with both diffuse and
specular lighting models• Can now be made to integrate with
radiosity
![Page 7: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/7.jpg)
“Radiosity Normal Mapping”• We created this technique to address the
strengths of both radiosity and normal mapping
• Highly efficient• This is the key to Half-Life 2®/ Valve
SourceTM shading.
![Page 8: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/8.jpg)
World vs. Model• The Valve SourceTM engine uses two
classes of geometry– World/Displacement geometry
• Large/static geometry• Radiosity light maps
– Model geometry• Static props, physics props, and animated
characters• Ambient cube
![Page 9: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/9.jpg)
Radiosity Normal Mapping• Normal mapping is typically accumulated
one light at a time– Multiple diffuse lights handled by summing
multiple N•L terms within or between passes• Radiosity Normal Mapping effectively
bump maps with respect to an arbitrary number of lights in one pass
![Page 10: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/10.jpg)
Basis for Radiosity Normal Mapping
31,0,
23
−−
31,
21,
61
−
31,
21,
61
![Page 11: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/11.jpg)
Computing Light map Values
• Traditionally, when computing light map values using a radiosity preprocessor, a single color value is calculated
• In Radiosity Normal Mapping, we transform our basis into tangent space and compute light values for each vector.
![Page 12: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/12.jpg)
At the pixel level. . .• Transform the normal from a normal map into
our basis• Sample three light map colors, and blend
between them based the transformed vector
lightmapColor[0] * dot( bumpBasis[0], normal )+lightmapColor[1] * dot( bumpBasis[1], normal )+lightmapColor[2] * dot( bumpBasis[2], normal )
![Page 13: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/13.jpg)
Radiosity Normal mappingRadiosity Normal mapping
![Page 14: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/14.jpg)
Radiosity Normal mappingRadiosity Normal mapping
![Page 15: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/15.jpg)
Radiosity Normal mappingRadiosity Normal mapping
![Page 16: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/16.jpg)
Radiosity Normal mappingRadiosity Normal mapping
![Page 17: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/17.jpg)
Radiosity Normal Mapping * Radiosity Normal Mapping * AlbedoAlbedo
![Page 18: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/18.jpg)
World Specular Lighting• Use cube maps for specular lighting.• Designers place point entities in their maps
which are the sample points for specular lighting.• Cube maps are pre-computed in-engine from the
level data using rendering.• World surfaces pick up the “best” cube map, or
cube maps can be manually assigned to surfaces to fix boundary problems.
![Page 19: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/19.jpg)
Environment probes placed in Level Editor
![Page 20: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/20.jpg)
World Lighting Equation• We will now illustrate Half-Life® 2 world
lighting one term at a time• Our desired image:
![Page 21: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/21.jpg)
Desired Image
![Page 22: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/22.jpg)
*
*
Radiosity Normal Mapping Shade Tree
+
NormalNormal
LightmapsLightmaps
Cube MapCube Map
Specular Specular FactorFactor
AlbedoAlbedo
![Page 23: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/23.jpg)
Radiosity
![Page 24: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/24.jpg)
Normal
![Page 25: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/25.jpg)
Radiosity Directional Component #1
![Page 26: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/26.jpg)
Radiosity Directional Component #2
![Page 27: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/27.jpg)
Radiosity Directional Component #3
![Page 28: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/28.jpg)
Normal Mapped Radiosity
![Page 29: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/29.jpg)
Radiosity
![Page 30: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/30.jpg)
Albedo
![Page 31: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/31.jpg)
Albedo * Normal Mapped Radiosity
![Page 32: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/32.jpg)
Albedo * Radiosity
![Page 33: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/33.jpg)
*
Radiosity Normal Mapping Shade Tree
NormalNormal
LightmapsLightmaps
AlbedoAlbedo
![Page 34: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/34.jpg)
Cube Map Specular
![Page 35: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/35.jpg)
Normal Mapped Specular
![Page 36: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/36.jpg)
Specular FactorSpecular Factor
![Page 37: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/37.jpg)
Normal Mapped Specular * Specular Factor
![Page 38: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/38.jpg)
Final Result
![Page 39: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/39.jpg)
*
*
Radiosity Normal Mapping Shade Tree
+
NormalNormal
LightmapsLightmaps
Cube MapCube Map
Specular Specular FactorFactor
AlbedoAlbedo
![Page 40: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/40.jpg)
Code Specialization
• Shader permutations generated offline• Static constants control code
specialization– Like #ifdef
• 1920 different pixel shaders
![Page 41: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/41.jpg)
Constant Pixel Shader Controlsstatic const bool g_bBaseTexture;static const bool g_bDetailTexture;static const bool g_bBumpmap;static const bool g_bDiffuseBumpmap;static const bool g_bCubemap;static const bool g_bVertexColor;static const bool g_bEnvmapMask;static const bool g_bBaseAlphaEnvmapMask;static const bool g_bSelfIllum;static const bool g_bNormalMapAlphaEnvmapMask;
![Page 42: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/42.jpg)
Invalid combinations• Some of these booleans have interactions and we can
disable certain combinations in our offline process to save runtime memory and speed up compilation.
• Some things like detail textures and normal maps we consider to be mutually exclusive.
• The base map’s alpha can be used for one of several things like an environment map mask or emissive mask so there are some combinations skipped based on this
![Page 43: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/43.jpg)
Constant Controls• Direct-mapped to specific registers
– Consistency with legacy paths– Don’t have to deal with HLSL constant table
const float4 g_EnvmapTint : register( c0 );const float3 g_EnvmapContrast : register( c2 );const float3 g_EnvmapSaturation : register( c3 );const float4 g_FresnelReflectionReg : register( c4 );const float g_OverbrightFactor : register( c6 );const float4 g_SelfIllumTint : register( c7 );
![Page 44: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/44.jpg)
Samplers
sampler BaseTextureSampler : register( s0 );sampler LightmapSampler : register( s1 );sampler EnvmapSampler : register( s2 );sampler DetailSampler : register( s3 );sampler BumpmapSampler : register( s4 );sampler EnvmapMaskSampler : register( s5 );sampler NormalizeSampler : register( s6 );
![Page 45: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/45.jpg)
Pixel Shader Input
struct PS_INPUT{
float2 baseTexCoord : TEXCOORD0;float4 detailOrBumpAndEnvmapMaskTexCoord : TEXCOORD1;float4 lightmapTexCoord1And2 : TEXCOORD2;float2 lightmapTexCoord3 : TEXCOORD3;float3 worldVertToEyeVector : TEXCOORD4;float3x3 tangentSpaceTranspose : TEXCOORD5;float4 vertexColor : COLOR;
};
![Page 46: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/46.jpg)
Pixel Shader main()float4 main( PS_INPUT i ) : COLOR{
float3 albedo = GetAlbedo( i );float alpha = GetAlpha( i );
float3 diffuseLighting = GetDiffuseLighting( i );float3 specularLighting = GetSpecularLighting( i );
float3 diffuseComponent = albedo * diffuseLighting;diffuseComponent *= g_OverbrightFactor;
if( g_bSelfIllum ){
float3 selfIllumComponent = g_SelfIllumTint * albedo;diffuseComponent = lerp(diffuseComponent, selfIllumComponent, GetBaseTexture(i).a );
}
return float4( diffuseComponent + specularLighting, alpha );}
![Page 47: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/47.jpg)
Diffuse Lightingfloat4 main( PS_INPUT i ) : COLOR{
float3 albedo = GetAlbedo( i );float alpha = GetAlpha( i );
float3 diffuseLighting = GetDiffuseLighting( i );float3 specularLighting = GetSpecularLighting( i );
float3 diffuseComponent = albedo * diffuseLighting;diffuseComponent *= g_OverbrightFactor;
if( g_bSelfIllum ){
float3 selfIllumComponent = g_SelfIllumTint * albedo;diffuseComponent = lerp(diffuseComponent, selfIllumComponent, GetBaseTexture(i).a );
}
return float4( diffuseComponent + specularLighting, alpha );}
![Page 48: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/48.jpg)
GetDiffuseLighting()float3 GetDiffuseLighting( PS_INPUT i ){
if( g_bBumpmap ){
return GetDiffuseLightingBumped( i );}else{
return GetDiffuseLightingUnbumped( i );}
}
![Page 49: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/49.jpg)
GetDiffuseLightingUnbumped()
float3 GetDiffuseLightingUnbumped( PS_INPUT i ){
float2 bumpCoord1 = ComputeLightmapCoordinates(i.lightmapTexCoord1And2,i.lightmapTexCoord3.xy );
return tex2D( LightmapSampler, bumpCoord1 );}
![Page 50: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/50.jpg)
GetDiffuseLightingBumped()float3 GetDiffuseLightingBumped( PS_INPUT i ){
float2 bumpCoord1, bumpCoord2, bumpCoord3;ComputeBumpedLightmapCoordinates( i.lightmapTexCoord1And2,
i.lightmapTexCoord3.xy,bumpCoord1, bumpCoord2, bumpCoord3 );
float3 lightmapColor1 = tex2D( LightmapSampler, bumpCoord1 );float3 lightmapColor2 = tex2D( LightmapSampler, bumpCoord2 );float3 lightmapColor3 = tex2D( LightmapSampler, bumpCoord3 );float3 normal = GetNormal( i );
float3 diffuseLighting =saturate( dot( normal, bumpBasis[0] ) ) * lightmapColor1 +saturate( dot( normal, bumpBasis[1] ) ) * lightmapColor2 +saturate( dot( normal, bumpBasis[2] ) ) * lightmapColor3;
return diffuseLighting;}
![Page 51: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/51.jpg)
Specular Lightingfloat4 main( PS_INPUT i ) : COLOR{
float3 albedo = GetAlbedo( i );float alpha = GetAlpha( i );
float3 diffuseLighting = GetDiffuseLighting( i );float3 specularLighting = GetSpecularLighting( i );
float3 diffuseComponent = albedo * diffuseLighting;diffuseComponent *= g_OverbrightFactor;
if( g_bSelfIllum ){
float3 selfIllumComponent = g_SelfIllumTint * albedo;diffuseComponent = lerp(diffuseComponent, selfIllumComponent, GetBaseTexture(i).a );
}
return float4( diffuseComponent + specularLighting, alpha );}
![Page 52: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/52.jpg)
GetSpecularLighting()float3 GetSpecularLighting( PS_INPUT i ){
float3 specularFactor = GetSpecularFactor( i );float3 normal = GetNormal( i );
float3 specularLighting = float3( 0.0f, 0.0f, 0.0f );if( g_bCubemap ){
float3 worldSpaceNormal = mul( normal, i.tangentSpaceTranspose );float fresnel = Fresnel( i, worldSpaceNormal );float3 reflectVect = CalcReflectionVectorUnnormalized( worldSpaceNormal,
i.worldVertToEyeVector );
specularLighting = texCUBE(EnvmapSampler, reflectVect) * specularFactor * g_EnvmapTint;specularLighting = fresnel * specularLighting;
}
return specularLighting;}
![Page 53: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/53.jpg)
Self Illuminationfloat4 main( PS_INPUT i ) : COLOR{
float3 albedo = GetAlbedo( i );float alpha = GetAlpha( i );
float3 diffuseLighting = GetDiffuseLighting( i );float3 specularLighting = GetSpecularLighting( i );
float3 diffuseComponent = albedo * diffuseLighting;diffuseComponent *= g_OverbrightFactor;
if( g_bSelfIllum ){
float3 selfIllumComponent = g_SelfIllumTint * albedo;diffuseComponent = lerp(diffuseComponent, selfIllumComponent, GetBaseTexture(i).a );
}
return float4( diffuseComponent + specularLighting, alpha );}
![Page 54: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/54.jpg)
Final Compositefloat4 main( PS_INPUT i ) : COLOR{
float3 albedo = GetAlbedo( i );float alpha = GetAlpha( i );
float3 diffuseLighting = GetDiffuseLighting( i );float3 specularLighting = GetSpecularLighting( i );
float3 diffuseComponent = albedo * diffuseLighting;diffuseComponent *= g_OverbrightFactor;
if( g_bSelfIllum ){
float3 selfIllumComponent = g_SelfIllumTint * albedo;diffuseComponent = lerp(diffuseComponent, selfIllumComponent, GetBaseTexture(i).a );
}
return float4( diffuseComponent + specularLighting, alpha );}
![Page 55: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/55.jpg)
Resulting Shaders• Many shaders are generated by this
process• Longest ps_2_0 shader is 43 ALU ops• Up to 7 texture fetches• Everything is single-passed on ps_2_0• Takes three passes on ps_1_1
![Page 56: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/56.jpg)
Most Complex Resulting Pixel Shadertexld r6, t1, s4mad r7.xyz, c1.x, r6, c1.ydp3 r8.x, r7, t5dp3 r8.y, r7, t6dp3 r8.z, r7, t7dp3 r1.x, r8, t4dp3 r0.x, r8, r8add r0.w, r1.x, r1.xmul r0.xyz, r0.x, t4mad r0.xyz, r0.w, r8, -r0mov r1.xy, t2.wzyxtexld r5, r0, s2texld r4, t4, s6texld r3, r1, s1texld r2, t2, s1texld r1, t3, s1texld r0, t0, s0
mul r5.xyz, r6.w, r5mul r6.xyz, r5, c0mad r5.xyz, r6, r6, -r6mad r4.xyz, c1.x, r4, c1.ydp3 r4.x, r8, r4dp3_sat r8.x, r7, c8mul r3.xyz, r3, r8.xdp3_sat r8.x, r7, c5dp3_sat r7.x, r7, c9mad r2.xyz, r8.x, r2, r3mad r1.xyz, r7.x, r1, r2add r1.w, -r4.x, c1.zmul r0.xyz, r0, v0mul r2.w, r1.w, r1.wmul r1.xyz, r1, r0mul r2.w, r2.w, r2.wmul r1.xyz, r1, c6.x
mul r1.w, r1.w, r2.wmad r0.xyz, c7, r0, -r1mad r1.w, r1.w, c4.z, c4.wmad r0.xyz, r0.w, r0, r1mad r2.xyz, c2, r5, r6max r2.w, r0.x, r0.ydp3 r3.x, r2, c10max r3.w, r0.z, c1.zlrp r1.xyz, c3, r2, r3.xmax r0.w, r2.w, r3.wmul r1.xyz, r1.w, r1rcp r0.w, r0.wmad r0.xyz, r0, r0.w, r1mov r0.w, v0.xmov oC0, r0
Use HLSLUse HLSL
![Page 57: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/57.jpg)
Model Shader• Input to vertex shader is 2 local lights plus a
directional ambient term via an “ambient cube” sourced from the radiosity solution.
![Page 58: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/58.jpg)
Ambient cube• Used to realistically integrate models with the
world via indirect lighting.• Ambient illumination for model geometry is
sampled at runtime from data generated by the radiosity solution. Any local lights that aren’t important enough to go directly into the vertex shader are also added to the ambient cube.
• Six colors are stored spatially in our level data:– Represent ambient light flowing through that
volume in space– Application looks this up for each model to
determine the six ambient colors to use for a given model.
+x
-x
+y
-y
-z +z
![Page 59: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/59.jpg)
Unbumped Ambient Cube Math
float3 AmbientLight( const float3 worldNormal ){
float3 nSquared = worldNormal * worldNormal;int3 isNegative = ( worldNormal < 0.0 );float3 linearColor;linearColor = nSquared.x * cAmbientCube[isNegative.x] +
nSquared.y * cAmbientCube[isNegative.y+2] +nSquared.z * cAmbientCube[isNegative.z+4];
return linearColor;}
![Page 60: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/60.jpg)
Radiosity normal mapped models
• Similar to world shader• Accumulates lighting onto the same basis in
the vertex shader
![Page 61: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/61.jpg)
Specular lighting for models• Similar to world shader• Pick the nearest cube map sample and use it• Could blend between samples, but we don’t
currently
![Page 62: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/62.jpg)
RadiosityRadiosity
![Page 63: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/63.jpg)
Normal MapNormal Map
![Page 64: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/64.jpg)
Radiosity Directional Component #1Radiosity Directional Component #1
![Page 65: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/65.jpg)
Radiosity Directional Component #2Radiosity Directional Component #2
![Page 66: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/66.jpg)
Radiosity Directional Component #3Radiosity Directional Component #3
![Page 67: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/67.jpg)
Normal Mapped RadiosityNormal Mapped Radiosity
![Page 68: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/68.jpg)
RadiosityRadiosity
![Page 69: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/69.jpg)
AlbedoAlbedo
![Page 70: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/70.jpg)
AlbedoAlbedo * Normal Mapped Radiosity* Normal Mapped Radiosity
![Page 71: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/71.jpg)
AlbedoAlbedo * Radiosity* Radiosity
![Page 72: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/72.jpg)
Cube Map SpecularCube Map Specular
![Page 73: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/73.jpg)
Normal Mapped SpecularNormal Mapped Specular
![Page 74: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/74.jpg)
Specular FactorSpecular Factor
![Page 75: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/75.jpg)
Normal Mapped Specular * Specular Factor
![Page 76: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/76.jpg)
Final ResultFinal Result
![Page 77: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/77.jpg)
Vertex Shader Combinations for Models
static const int g_LightCombostatic const int g_FogTypestatic const int g_NumBonesstatic const bool g_bBumpmapstatic const bool g_bVertexColorstatic const bool g_bNormalOrTangentSpace
static const int g_StaticLightType = g_StaticLightTypeArray[g_LightCombo];static const int g_AmbientLightType = g_AmbientLightTypeArray[g_LightCombo];static const int g_LocalLightType0 = g_LocalLightType0Array[g_LightCombo];static const int g_LocalLightType1 = g_LocalLightType1Array[g_LightCombo];
![Page 78: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/78.jpg)
Model Vertex Shader Inputsstruct VS_INPUT{
float4 vPos : POSITION;float4 vBoneWeights : BLENDWEIGHT;float4 vBoneIndices : BLENDINDICES;float3 vNormal : NORMAL;float4 vColor : COLOR0;float3 vSpecular : COLOR1;float4 vTexCoord0 : TEXCOORD0;float4 vTexCoord1 : TEXCOORD1;float4 vTexCoord2 : TEXCOORD2;float4 vTexCoord3 : TEXCOORD3;float3 vTangentS : TANGENT;float3 vTangentT : BINORMAL;float4 vUserData : TANGENT;
};
![Page 79: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/79.jpg)
Model Vertex Shader Outputs
struct VS_OUTPUT{
float4 projPos : POSITION;float fog : FOG;float2 baseTexCoord : TEXCOORD0;float2 detailOrBumpTexCoord : TEXCOORD1;float2 envmapMaskTexCoord : TEXCOORD2;float3 worldVertToEyeVector : TEXCOORD3;float3x3 tangentSpaceTranspose : TEXCOORD4;float4 color1 : COLOR0;float3 color2 : COLOR1;float3 color3 : TEXCOORD7;
};
This is what we’re computing on the next few slides:
![Page 80: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/80.jpg)
Vertex Shader main()VS_OUTPUT main( const VS_INPUT v ) {
… skin …fog…
DoBumped( worldPos, worldNormal, worldTangentS,worldTangentT, v.vSpecular, v.vSpecular,v.vSpecular, v.vSpecular, g_StaticLightType,g_AmbientLightType, g_LocalLightType0,g_LocalLightType1, 1.0f,o.color1.xyz, o.color2.xyz, o.color3.xyz );
…}
![Page 81: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/81.jpg)
void DoBumped( ... ){
// special case for no lightingif( staticLightType == LIGHTTYPE_NONE && ambientLightType == LIGHTTYPE_NONE &&
localLightType0 == LIGHTTYPE_NONE && localLightType1 == LIGHTTYPE_NONE ){
color1 = color2 = color3 = 0.0f;gammaColorNormal = 0.0f;
}else if( staticLightType == LIGHTTYPE_STATIC &&
ambientLightType == LIGHTTYPE_NONE &&localLightType0 == LIGHTTYPE_NONE &&localLightType1 == LIGHTTYPE_NONE )
{DoBumpedStaticLightingOnly( staticLightingColor1, staticLightingColor2,
staticLightingColor3,color1, color2, color3 );}else{
DoBumpedLighting( worldPos, worldNormal, worldTangentS, worldTangentT,staticLightingColor1, staticLightingColor2,staticLightingColor3, staticLightingColorNormal,staticLightType, ambientLightType, localLightType0,localLightType1, modulation, color1, color2, color3 );
}}
![Page 82: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/82.jpg)
void DoBumpedLighting( ... ){
float3 worldBumpBasis1, worldBumpBasis2, worldBumpBasis3;CalculateWorldBumpBasis( worldTangentS, worldTangentT, worldNormal,
worldBumpBasis1, worldBumpBasis2, worldBumpBasis3 );
CalcBumpedStaticLighting(staticLightingColor1, staticLightingColor2,staticLightingColor3,staticLightType, color1, color2, color3 );
if( ambientLightType == LIGHTTYPE_AMBIENT )AddBumpedAmbientLight( worldBumpBasis1, worldBumpBasis2, worldBumpBasis3,
worldNormal, color1, color2, color3 );
if( localLightType0 != LIGHTTYPE_NONE )AddBumpedLight( worldPos, worldNormal, worldBumpBasis1, worldBumpBasis2,
worldBumpBasis3, 0, localLightType0, color1, color2,color3 );
if( localLightType1 != LIGHTTYPE_NONE )AddBumpedLight( worldPos, worldNormal, worldBumpBasis1, worldBumpBasis2,
worldBumpBasis3, 1, localLightType1, color1, color2, color3 );
}
![Page 83: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/83.jpg)
void AddBumpedAmbientLight( ... ){
float3 nSquared;int3 isNegative;
nSquared = worldBumpBasis1 * worldBumpBasis1;isNegative = ( worldBumpBasis1 < 0.0 );color1 += nSquared.x * cAmbientCube[isNegative.x] +
nSquared.y * cAmbientCube[isNegative.y+2] +nSquared.z * cAmbientCube[isNegative.z+4];
nSquared = worldBumpBasis2 * worldBumpBasis2;isNegative = ( worldBumpBasis2 < 0.0 );color2 += nSquared.x * cAmbientCube[isNegative.x] +
nSquared.y * cAmbientCube[isNegative.y+2] +nSquared.z * cAmbientCube[isNegative.z+4];
nSquared = worldBumpBasis3 * worldBumpBasis3;isNegative = ( worldBumpBasis3 < 0.0 );color3 += nSquared.x * cAmbientCube[isNegative.x] +
nSquared.y * cAmbientCube[isNegative.y+2] +nSquared.z * cAmbientCube[isNegative.z+4];
}
+x
-x
+y
-y
-z +z
![Page 84: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/84.jpg)
void AddBumpedLight( ... ){
if( lightType == LIGHTTYPE_SPOT ){
AddBumpedSpotLight( worldPos, lightNum, worldBumpBasis1,worldBumpBasis2, worldBumpBasis3,worldNormal, color1, color2, color3 );
}else if( lightType == LIGHTTYPE_POINT ){
AddBumpedPointLight( worldPos, lightNum, worldBumpBasis1,worldBumpBasis2, worldBumpBasis3,worldNormal, color1, color2, color3 );
}else{
AddBumpedDirectionalLight( lightNum, worldBumpBasis1,worldBumpBasis2, worldBumpBasis3,worldNormal, color1, color2, color3 );
}}
![Page 85: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/85.jpg)
void AddBumpedPointLight( ... ){
float3 lightDir = cLightInfo[lightNum].pos - worldPos; // Light directionfloat lightDistSquared = dot( lightDir, lightDir ); // Light distance^2float ooLightDist = rsqrt( lightDistSquared ); // 1/lightDistancelightDir *= ooLightDist; // Normalize
float4 attenuationFactors; // Dist attenuationattenuationFactors.x = 1.0f;attenuationFactors.y = lightDistSquared * ooLightDist;attenuationFactors.z = lightDistSquared;attenuationFactors.w = ooLightDist;
float4 distanceAtten = 1.0f / dot( cLightInfo[lightNum].atten, attenuationFactors );
// Compute N dot Lfloat3 lambertAtten = float3( dot( worldBumpBasis1, lightDir ),
dot( worldBumpBasis2, lightDir ),dot( worldBumpBasis3, lightDir ) );
lambertAtten = max( lambertAtten, 0.0 );
float3 color = cLightInfo[lightNum].color * distanceAtten;color1 += color * lambertAtten.x;color2 += color * lambertAtten.y;color3 += color * lambertAtten.z;
}
![Page 86: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/86.jpg)
Bumped Model Pixel ShaderdiffuseLighting = saturate( dot( tangentSpaceNormal, bumpBasis[0] ) ) * i.color1.rgb +saturate( dot( tangentSpaceNormal, bumpBasis[1] ) ) * i.color2.rgb +saturate( dot( tangentSpaceNormal, bumpBasis[2] ) ) * i.color3.rgb;
![Page 87: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/87.jpg)
Refraction Mapping• Refractive materials and water surfaces• Render to multisample antialiased back
buffer normally• Use StretchRect() to copy to texture• Project onto geometry, offsetting in
screen space with either a dudv map, or a normal map
![Page 88: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/88.jpg)
Refraction Mapping
![Page 89: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/89.jpg)
Samplers and Constant Inputssampler RefractSampler : register( s2 );sampler NormalSampler : register( s3 );sampler RefractTintSampler : register( s5 );
const float3 g_EnvmapTint : register( c0 );const float3 g_RefractTint : register( c1 );const float3 g_EnvmapContrast : register( c2 );const float3 g_EnvmapSaturation : register( c3 );const float2 g_RefractScale : register( c5 );
![Page 90: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/90.jpg)
Refraction Inputstruct PS_INPUT{
float2 vBumpTexCoord : TEXCOORD0;float3 vWorldVertToEyeVector : TEXCOORD1;float3x3 tangentSpaceTranspose : TEXCOORD2;float3 vRefractXYW : TEXCOORD5; float3 projNormal : TEXCOORD6;
};
![Page 91: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/91.jpg)
Refraction Shaderfloat4 main( PS_INPUT i ) : COLOR{
// Load normal and expand rangefloat4 vNormalSample = tex2D( NormalSampler, i.vBumpTexCoord );float3 tangentSpaceNormal = vNormalSample * 2.0 - 1.0;
float3 refractTintColor = 2.0 * g_RefractTint * tex2D( RefractTintSampler, i.vBumpTexCoord );
// Perform division by W only oncefloat ooW = 1.0f / i.vRefractXYW.z;
// Compute coordinates for sampling refractionfloat2 vRefractTexCoordNoWarp = i.vRefractXYW.xy * ooW;float2 vRefractTexCoord = tangentSpaceNormal.xy;float scale = vNormalSample.a * g_RefractScale;vRefractTexCoord = vRefractTexCoord * scale;vRefractTexCoord += vRefractTexCoordNoWarp;
float3 result = refractTintColor * tex2D( RefractSampler,vRefractTexCoord.xy );
return float4( result, vNormalSample.a );}
![Page 92: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/92.jpg)
Water• Render to multisample antialiased back
buffer normally for both refraction and reflection textures
• Use StretchRect() to copy to texture• Render water surface
![Page 93: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/93.jpg)
Water Samplers and Inputssampler RefractSampler : register( s2 );sampler ReflectSampler : register( s4 );sampler NormalSampler : register( s3 );sampler NormalizeSampler : register( s6 );
const float4 vRefractTint : register( c1 );const float4 vReflectTint : register( c4 );
// xy - reflect scale, zw - refract scaleconst float4 g_ReflectRefractScale : register( c5 );
static const bool g_bReflect;static const bool g_bRefract;
struct PS_INPUT{
float2 vBumpTexCoord : TEXCOORD0;float3 vTangentEyeVect : TEXCOORD1;float4 vReflectXY_vRefractYX : TEXCOORD2;float W : TEXCOORD3;
};
Used during preprocess for code specialization
![Page 94: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/94.jpg)
Water Shader
float4 main( PS_INPUT i ) : COLOR{
// Load normal and expand rangefloat4 vNormalSample = tex2D( NormalSampler, i.vBumpTexCoord );float3 vNormal = vNormalSample * 2.0 - 1.0;
float ooW = 1.0f / i.W; // Perform division by W only once
float2 vReflectTexCoord, vRefractTexCoord;
float4 vN; // vectorize the dependent UV calculations (reflect = .xy, refract = .wz)vN.xy = vNormal.xy;vN.w = vNormal.x;vN.z = vNormal.y;float4 vDependentTexCoords = vN * vNormalSample.a * g_ReflectRefractScale;
vDependentTexCoords += ( i.vReflectXY_vRefractYX * ooW );vReflectTexCoord = vDependentTexCoords.xy;vRefractTexCoord = vDependentTexCoords.wz;
float4 vReflectColor = tex2D( ReflectSampler, vReflectTexCoord ) * vReflectTint; // Sample reflectionfloat4 vRefractColor = tex2D( RefractSampler, vRefractTexCoord ) * vRefractTint; // and refraction
float3 vEyeVect = texCUBE( NormalizeSampler, i.vTangentEyeVect ) * 2.0 - 1.0;
float fNdotV = saturate( dot( vEyeVect, vNormal ) ); // Fresnel termfloat 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 );}
}
![Page 95: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/95.jpg)
Reflective and Refractive Water
![Page 96: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/96.jpg)
Reflection and Refraction Maps
Reflection Map Refraction Map
![Page 97: Half-Life 2 / Valve Source · PDF fileHalf-Life® 2 / Valve Source™ Shading 22 MARCH 2004 / Gary McTaggart ... Half-Life, the Half-Life logo, the Lambda logo,Valve Source](https://reader033.vdocument.in/reader033/viewer/2022050813/5a79b4c07f8b9ad7608bac5f/html5/thumbnails/97.jpg)
Summary• Radiosity Normal Mapping• World Geometry pixel shading
– Lighting equation– Managing shader permutations
• Model Geometry vertex shading• Reflection and Refraction
©2004 Valve Corporation. All rights reserved. Valve, the Valve logo, Half-Life, the Half-Life logo, the Lambda logo, Valve Source and the Source logo are trademarks and/or registered trademarks of Valve Corporation.