BumpMapping.fx
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:7k
源码类别:

2D图形编程

开发平台:

Delphi

  1. //---------------------------------------------------------------------------
  2. // BumpMapping.fx                                       Modified: -Apr-2007
  3. // Bump-mapping shader with phong reflection model                Version 1.0
  4. //---------------------------------------------------------------------------
  5. // Important Notice:
  6. //
  7. // If you modify/use this code or one of its parts either in original or
  8. // modified form, you must comply with Mozilla Public License v1.1,
  9. // specifically section 3, "Distribution Obligations". Failure to do so will
  10. // result in the license breach, which will be resolved in the court.
  11. // Remember that violating author's rights is considered a serious crime in
  12. // many countries. Thank you!
  13. //
  14. // !! Please *read* Mozilla Public License 1.1 document located at:
  15. //  http://www.mozilla.org/MPL/
  16. //
  17. // If you require any clarifications about the license, feel free to contact
  18. // us or post your question on our forums at: http://www.afterwarp.net
  19. //---------------------------------------------------------------------------
  20. // The contents of this file are subject to the Mozilla Public License
  21. // Version 1.1 (the "License"); you may not use this file except in
  22. // compliance with the License. You may obtain a copy of the License at
  23. // http://www.mozilla.org/MPL/
  24. //
  25. // Software distributed under the License is distributed on an "AS IS"
  26. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  27. // License for the specific language governing rights and limitations
  28. // under the License.
  29. //
  30. // The Original Code is BumpMapping.pas.
  31. //
  32. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  33. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  34. // M. Sc. Yuriy Kotsarenko. All Rights Reserved.
  35. //---------------------------------------------------------------------------
  36. uniform extern float4x4 WorldInverseTranspose : WorldInverseTranspose;
  37. uniform extern float4x4 WorldViewProjection   : WorldViewProjection;
  38. uniform extern float4x4 World  : World;
  39. uniform extern float3   EyePos : CameraPosition;
  40. uniform extern float4x4 WorldInverse : WorldInverse;
  41. uniform extern float3x3 SkinMtx;
  42. uniform extern float3x3 BumpMtx;
  43. //---------------------------------------------------------------------------
  44. uniform extern float3 AmbientColor : Ambient
  45. <
  46.   string UIName   = "AmbientColor";
  47.   string UIWidget = "Color";
  48. > = {0.0f, 0.0f, 0.1f};
  49. //---------------------------------------------------------------------------
  50. uniform extern float4 DiffuseColor : Diffuse
  51. <
  52.   string UIName   = "DiffuseColor";
  53.   string UIWidget = "Color";
  54. > = {0.0f, 0.0f, 1.0f, 1.0f};
  55. //---------------------------------------------------------------------------
  56. uniform extern float3 SpecularColor : Specular
  57. <
  58.   string UIName   = "SpecularColor";
  59.   string UIWidget = "Color";
  60. > = {1.0f, 1.0f, 1.0f};
  61. //---------------------------------------------------------------------------
  62. uniform extern float SpecularPower
  63. <
  64.   string UIWidget = "slider";
  65.   float  UIMin    = 0.0;
  66.   float  UIMax    = 50.0;
  67.   float  UIStep   = 1.0;
  68.   string UIName   = "SpecularPower";
  69. > = 8.0;
  70. //---------------------------------------------------------------------------
  71. uniform extern float3 LightVector : Direction
  72. <
  73.   string Object = "DirectionalLight";
  74.   string Space = "World";
  75. > = {1.0f, -1.0f, 1.0f};
  76. //---------------------------------------------------------------------------
  77. texture SkinTexture
  78. <
  79.   string ResourceName = "metal.dds";
  80. >;
  81. //------------------------------------
  82. sampler SkinSampler = sampler_state 
  83. {
  84.   texture   = <SkinTexture>;
  85.   AddressU  = WRAP;
  86.   AddressV  = WRAP;
  87.   AddressW  = WRAP;
  88.   MIPFILTER = LINEAR;
  89.   MINFILTER = LINEAR;
  90.   MAGFILTER = LINEAR;
  91. };
  92. //---------------------------------------------------------------------------
  93. texture BumpTexture
  94. <
  95.   string ResourceName = "metal_normal.dds";
  96. >;
  97. //------------------------------------
  98. sampler BumpSampler = sampler_state 
  99. {
  100.   texture   = <BumpTexture>;
  101.   AddressU  = WRAP;
  102.   AddressV  = WRAP;
  103.   AddressW  = WRAP;
  104.   MIPFILTER = LINEAR;
  105.   MINFILTER = LINEAR;
  106.   MAGFILTER = LINEAR;
  107. };
  108. //---------------------------------------------------------------------------
  109. void VS(
  110.  float3 PositionOS: POSITION0, 
  111.  float3 TangentOS : TANGENT0,
  112.  float3 BinormalOS: BINORMAL0,
  113.  float3 NormalOS  : NORMAL0,
  114.  float2 InTex     : TEXCOORD0,
  115.  out float4 OutPos     : POSITION, 
  116.  out float4 OutTex     : TEXCOORD0,
  117.  out float3 OutToEye   : TEXCOORD1,
  118.  out float3 OutLightVec: TEXCOORD2
  119. )
  120. {
  121.   // Transform normal, binormal and tangent vectors to world space.
  122.   float3 NormalWS   = mul(float4(NormalOS, 0.0f), WorldInverseTranspose).xyz;
  123.   float3 TangentWS  = mul(float4(TangentOS, 0.0f), WorldInverseTranspose).xyz;
  124.   float3 BinormalWS = mul(float4(BinormalOS, 0.0f), WorldInverseTranspose).xyz;
  125.   
  126.   NormalWS   = normalize(NormalWS);
  127.   TangentWS  = normalize(TangentWS);
  128.   BinormalWS = normalize(BinormalWS);
  129.   
  130.   // Compute matrix for transforming from world space to tangent space.
  131.   float3x3 WorldToTangent = transpose(float3x3(TangentWS, BinormalWS, NormalWS));
  132.   
  133.   // Transform light direction and vertex-to-eye vector to tangent space.
  134.   OutLightVec = mul(LightVector, WorldToTangent);
  135.     
  136.   float3 PosWS = mul(float4(PositionOS, 1.0f), WorldToTangent).xyz;
  137.   OutToEye = mul(EyePos - PosWS, WorldToTangent);
  138.   
  139.   OutPos = mul(float4(PositionOS, 1.0f), WorldViewProjection);
  140.   
  141.   // Transform texture coordinates.
  142.   OutTex.xy = mul(float3(InTex, 1.0f),  SkinMtx).xy;
  143.   OutTex.zw = mul(float3(InTex, 1.0f), BumpMtx).xy;
  144. }
  145. //---------------------------------------------------------------------------
  146. float4 PS(
  147.  float4 InTex: TEXCOORD0,
  148.  float3 ToEye: TEXCOORD1,
  149.  float3 LightVec: TEXCOORD2 
  150. ): COLOR
  151. {
  152.   // Normalize vertex-to-eye and light direction vectors.
  153.   ToEye    = normalize(ToEye);
  154.   LightVec = -normalize(LightVec);
  155.     
  156.   // Retreive surface normal from bump texture.
  157.   float3 NormalT = tex2D(BumpSampler, InTex.zw);
  158.   NormalT = normalize(2.0f * NormalT - 1.0f);
  159.   
  160.   // Retreive skin pixel from skin texture.
  161.   float4 TexPixel = tex2D(SkinSampler, InTex.xy);
  162.   
  163.   // Calculate self-shadow component.
  164.   float Shadow = saturate(4.0f * LightVec.z);
  165.   
  166.   // Compute diffuse color component.
  167.   float3 Diffuse = TexPixel.rgb * DiffuseColor.rgb * 
  168.    Shadow * saturate(dot(LightVec, NormalT));
  169.     
  170.   // Compute specular color component.
  171.   float3 Reflection = normalize(2.0f * NormalT * dot(NormalT, 
  172.    LightVec) - LightVec);
  173.       
  174.   float3 Specular = SpecularColor * Shadow * (pow(saturate(dot(Reflection, 
  175.    ToEye)), SpecularPower));
  176.   
  177.   // Compute ambient color component.
  178.   float3 Ambient = AmbientColor * TexPixel.rgb; 
  179.   
  180.   return float4(Ambient + Diffuse + Specular, TexPixel.a * DiffuseColor.a);  
  181. }
  182. //---------------------------------------------------------------------------
  183. technique BumpMapping
  184. {
  185.   pass p0 
  186.   {
  187.     VertexShader = compile vs_2_0 VS();
  188.     PixelShader  = compile ps_2_0 PS();
  189.   }
  190. }