[765] | 1 | float4x4 WorldViewProj;
|
---|
| 2 | float4x4 WorldView;
|
---|
| 3 | float4x4 WorldViewIT;
|
---|
| 4 | float3 mCameraPos; // model-space Camera position
|
---|
| 5 | float3 mLightPos; // model-space Light position
|
---|
| 6 | float focalDist;
|
---|
| 7 | float focalRange;
|
---|
| 8 | //------------------------------------------------------------------------------------ |
---|
| 9 | // macro definition for filtered samplers
|
---|
| 10 | //------------------------------------------------------------------------------------ |
---|
| 11 | #define SAMPLER_LINEAR(g_samplerMap, g_txMap); \
|
---|
| 12 | sampler2D g_samplerMap = sampler_state { \
|
---|
| 13 | Texture = <g_txMap>; \
|
---|
| 14 | MinFilter = Linear; \
|
---|
| 15 | MagFilter = Linear; \
|
---|
| 16 | MipFilter = Linear; \
|
---|
| 17 | AddressU = WRAP; \
|
---|
| 18 | AddressV = WRAP; \
|
---|
| 19 | };
|
---|
| 20 |
|
---|
| 21 | texture ColorMap;
|
---|
| 22 | SAMPLER_LINEAR(ColorMapSampler, ColorMap);
|
---|
| 23 | texture BumpMap;
|
---|
| 24 | SAMPLER_LINEAR(BumpMapSampler,BumpMap);
|
---|
| 25 |
|
---|
| 26 | // Illumination functions
|
---|
| 27 | #include "illum.hlsl"
|
---|
| 28 | |
---|
| 29 | struct VS_INPUT { |
---|
| 30 | float4 Position : POSITION;
|
---|
| 31 | float3 Normal : NORMAL;
|
---|
| 32 | float3 Binormal : BINORMAL;
|
---|
| 33 | float3 Tangent : TANGENT;
|
---|
| 34 | float4 TexCoord0 : TEXCOORD0;
|
---|
| 35 | }; |
---|
| 36 | |
---|
| 37 | struct VS_OUTPUT { |
---|
| 38 | float4 hPosition : POSITION; // point in normalized device space before homogeneous division |
---|
| 39 | float2 TexCoord : TEXCOORD0; // texture coordinates |
---|
| 40 | float3 tView : TEXCOORD1; // tangent space view vector |
---|
| 41 | float3 tLight : TEXCOORD2; // tangent space light vector |
---|
| 42 | float Depth : TEXCOORD3;
|
---|
| 43 | }; |
---|
| 44 | |
---|
| 45 | struct PS_OUTPUT {
|
---|
| 46 | float4 Color : COLOR0;
|
---|
| 47 | float4 Depth : COLOR1;
|
---|
| 48 | };
|
---|
| 49 | |
---|
| 50 | //------------------------------------------------------------------------------------ |
---|
| 51 | // |
---|
| 52 | // Base vertex shader: vertex shader for all methods: calculates tangent-space |
---|
| 53 | // tLight, tView, hPosition vectors |
---|
| 54 | // |
---|
| 55 | //------------------------------------------------------------------------------------ |
---|
| 56 | VS_OUTPUT BumpVS(VS_INPUT IN)
|
---|
| 57 | {
|
---|
| 58 | VS_OUTPUT output;
|
---|
| 59 |
|
---|
| 60 | // object-space tangent matrix
|
---|
| 61 | float3x3 Tan = float3x3(normalize(IN.Tangent), normalize(IN.Binormal), IN.Normal);
|
---|
| 62 | // position in view-space
|
---|
| 63 | float3 P = mul(IN.Position, WorldView);
|
---|
| 64 | // model-space view vector
|
---|
| 65 | float3 mView = mCameraPos - IN.Position;
|
---|
| 66 | // model-space light vector
|
---|
| 67 | float3 mLight = mLightPos - IN.Position;
|
---|
| 68 | // tangent-space view vector
|
---|
| 69 | output.tView = mul(Tan, mView);
|
---|
| 70 | // tangent-space light vector
|
---|
| 71 | output.tLight = mul(Tan, mLight);
|
---|
| 72 | // vertex position before homogenious division
|
---|
| 73 | output.hPosition = mul(IN.Position, WorldViewProj);
|
---|
| 74 | // tex coordinates passed to pixel shader
|
---|
| 75 | output.TexCoord = IN.TexCoord0;
|
---|
| 76 | output.Depth = output.hPosition.z;
|
---|
| 77 |
|
---|
| 78 | return output;
|
---|
| 79 | } |
---|
| 80 | //------------------------------------------------------------------------------------ |
---|
| 81 | // |
---|
| 82 | // BumpPS: Bump Mapping pixel shader |
---|
| 83 | // |
---|
| 84 | //------------------------------------------------------------------------------------ |
---|
| 85 | PS_OUTPUT BumpPS(VS_OUTPUT IN) |
---|
| 86 | { |
---|
| 87 | PS_OUTPUT output; |
---|
| 88 | // needs normalization because of linear interpolation |
---|
| 89 | float3 View = normalize( IN.tView ); |
---|
| 90 | // needs normalization because of linear interpolation |
---|
| 91 | float3 Light = normalize( IN.tLight ); |
---|
| 92 | // get tangent-space normal from normal map |
---|
| 93 | float3 Normal = tex2D(BumpMapSampler, IN.TexCoord).rgb; |
---|
| 94 | // illumination calculation |
---|
| 95 | output.Color = Illumination(Light, Normal, View, IN.TexCoord, Attenuation(IN.tLight)); |
---|
| 96 | |
---|
| 97 | float blur = saturate(abs(IN.Depth - focalDist) * focalRange);
|
---|
| 98 | output.Depth = float4(IN.Depth, blur, 0, 0); |
---|
| 99 | |
---|
| 100 | return output; |
---|
| 101 | }
|
---|
| 102 | //------------------------------------------------------------------------------------
|
---|
| 103 | // Technique definitions
|
---|
| 104 | //------------------------------------------------------------------------------------
|
---|
| 105 | technique BumpMapping
|
---|
| 106 | {
|
---|
| 107 | pass p0
|
---|
| 108 | {
|
---|
| 109 | VertexShader = compile vs_3_0 BumpVS();
|
---|
| 110 | PixelShader = compile ps_3_0 BumpPS();
|
---|
| 111 | }
|
---|
| 112 | } |
---|