OffsetMapping.hlsl
上传用户:xhbjoy
上传日期:2014-10-07
资源大小:38068k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* Offset mapping including a shadow element and multiple lights in one pass */ 
  2. void integratedshadows_vp(float4 position   : POSITION, 
  3.               float3 normal      : NORMAL, 
  4.               float2 uv         : TEXCOORD0, 
  5.               float3 tangent     : TANGENT0, 
  6.               // outputs 
  7.               out float4 oPosition    : POSITION, 
  8.               out float2 oUv          : TEXCOORD0, 
  9.               out float3 oLightDir    : TEXCOORD1, // tangent space 
  10.              out float3 oEyeDir       : TEXCOORD2, // tangent space 
  11.  out float3 oSpotDirection : TEXCOORD3, // tangent space
  12.               out float3 oLightDir1    : TEXCOORD4, // tangent space 
  13.               out float3 oSpotDirection1    : TEXCOORD5, // tangent space 
  14.  out float4 oShadowUV1 : TEXCOORD6,
  15.  out float4 oShadowUV2 : TEXCOORD7,
  16.               // parameters 
  17.               uniform float4 lightPosition, // object space 
  18.               uniform float4 lightPosition1, // object space 
  19.               uniform float3 eyePosition,   // object space 
  20.     uniform float3 spotDirection, // object space
  21.     uniform float3 spotDirection1, // object space
  22.               uniform float4x4 worldViewProj,
  23.   uniform float4x4 worldMatrix,
  24.   uniform float4x4 texViewProj1,
  25.   uniform float4x4 texViewProj2) 
  26. {  
  27.    // calculate output position 
  28.    oPosition = mul(worldViewProj, position); 
  29.    float4 worldPos = mul(worldMatrix, position);
  30.    oShadowUV1 = mul(texViewProj1, worldPos);
  31.    oShadowUV2 = mul(texViewProj2, worldPos);
  32.    
  33.    
  34.    // pass the main uvs straight through unchanged 
  35.    oUv = uv; 
  36.    // calculate tangent space light vector 
  37.    // Get object space light direction 
  38.    float3 lightDir = normalize(lightPosition.xyz -  (position * lightPosition.w));
  39.    float3 lightDir1 = normalize(lightPosition1.xyz -  (position * lightPosition1.w));
  40.    float3 eyeDir = eyePosition - position.xyz; 
  41.     
  42.    // Calculate the binormal (NB we assume both normal and tangent are 
  43.    // already normalised) 
  44.    // NB looks like nvidia cross params are BACKWARDS to what you'd expect 
  45.    // this equates to NxT, not TxN 
  46.    float3 binormal = cross(tangent, normal); 
  47.     
  48.    // Form a rotation matrix out of the vectors 
  49.    float3x3 rotation = float3x3(tangent, binormal, normal); 
  50.     
  51.    // Transform the light vector according to this matrix 
  52.    lightDir = normalize(mul(rotation, lightDir)); 
  53.    lightDir1 = normalize(mul(rotation, lightDir1)); 
  54.    eyeDir = normalize(mul(rotation, eyeDir)); 
  55.    oLightDir = lightDir; 
  56.    oLightDir1 = lightDir1; 
  57.    oEyeDir = eyeDir; 
  58.    oSpotDirection = normalize(mul(rotation, -spotDirection));
  59.    oSpotDirection1 = normalize(mul(rotation, -spotDirection1));
  60. }
  61. // Expand a range-compressed vector
  62. float3 expand(float3 v)
  63. {
  64. return (v - 0.5) * 2;
  65. }
  66. void integratedshadows_fp(
  67. float2 uv : TEXCOORD0,
  68. float3 lightDir : TEXCOORD1,
  69. float3 eyeDir : TEXCOORD2,
  70. float3 spotDir : TEXCOORD3,
  71. float3 lightDir1 : TEXCOORD4,
  72. float3 spotDir1 : TEXCOORD5,
  73. float4 shadowUV1 : TEXCOORD6,
  74. float4 shadowUV2 : TEXCOORD7,
  75. uniform float3 lightDiffuse,
  76. uniform float4 scaleBias,
  77.     uniform float4 spotParams,
  78. uniform float3 lightDiffuse1,
  79.     uniform float4 spotParams1,
  80. uniform sampler2D normalHeightMap : register(s0),
  81. uniform sampler2D diffuseMap : register(s1),
  82. uniform sampler2D shadowMap1 : register(s2),
  83. uniform sampler2D shadowMap2 : register(s3),
  84. out float4 oColour : COLOR)
  85. {
  86. // get the height using the tex coords
  87. float height = tex2D(normalHeightMap, uv).a;
  88. // scale and bias factors
  89. float scale = scaleBias.x;
  90. float bias = scaleBias.y;
  91. // calculate displacement
  92. float displacement = (height * scale) + bias;
  93. float3 uv2 = float3(uv, 1);
  94. float3 scaledEyeDir = eyeDir * displacement;
  95. // calculate the new tex coord to use for normal and diffuse
  96. float2 newTexCoord = (scaledEyeDir + uv2).xy;
  97. // get the new normal and diffuse values
  98. float3 normal = expand(tex2D(normalHeightMap, newTexCoord).xyz);
  99. float3 diffuse = tex2D(diffuseMap, newTexCoord).xyz;
  100. float3 col1 = diffuse * saturate(dot(normal, lightDir)) * lightDiffuse;
  101. // factor in spotlight angle
  102. float rho = saturate(dot(spotDir, lightDir));
  103. // factor = (rho - cos(outer/2) / cos(inner/2) - cos(outer/2)) ^ falloff
  104. float spotFactor = pow(
  105. saturate(rho - spotParams.y) / (spotParams.x - spotParams.y), spotParams.z);
  106. col1 = col1 * spotFactor;
  107. float3 col2 = diffuse * saturate(dot(normal, lightDir1)) * lightDiffuse1;
  108. // factor in spotlight angle
  109. rho = saturate(dot(spotDir1, lightDir1));
  110. // factor = (rho - cos(outer/2) / cos(inner/2) - cos(outer/2)) ^ falloff
  111. spotFactor = pow(
  112. saturate(rho - spotParams1.y) / (spotParams1.x - spotParams1.y), spotParams1.z);
  113. col2 = col2 * spotFactor;
  114. // shadow textures
  115. col1 = col1 * tex2Dproj(shadowMap1, shadowUV1);
  116. col2 = col2 * tex2Dproj(shadowMap2, shadowUV2);
  117. oColour = float4(col1 + col2, 1);
  118. }