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

2D图形编程

开发平台:

Delphi

  1. //---------------------------------------------------------------------------
  2. #define SMAP_SIZE 512
  3. //#define SHADOW_EPSILON 0.00115f
  4. #define SHADOW_EPSILON 0.00005f
  5. #define ShadowBilinearFilter
  6. //---------------------------------------------------------------------------
  7. float4x4 LightWVP;
  8. //---------------------------------------------------------------------------
  9. float4x4 WorldInverseTranspose;
  10. float4x4 WorldViewProjection;
  11. float4x4 World;
  12. float3   EyePos;
  13. float3x3 TexMtx;
  14. //---------------------------------------------------------------------------
  15. float3 LightPos = {1.0f, 1.0f, 1.0f};
  16. float3 LightDir = {0.0f, -1.0f, 0.0f};
  17. //---------------------------------------------------------------------------
  18. float  Ambient;
  19. float3 Specular;
  20. float1 SpecPower;
  21. //---------------------------------------------------------------------------
  22. texture SkinTex;
  23. texture BumpTex;
  24. texture SMapTex;
  25. //------------------------------------
  26. sampler SkinSampler = sampler_state 
  27. {
  28.   texture   = <SkinTex>;
  29.   AddressU  = WRAP;
  30.   AddressV  = WRAP;
  31.   AddressW  = WRAP;
  32.   MIPFILTER = LINEAR;
  33.   MINFILTER = LINEAR;
  34.   MAGFILTER = LINEAR;
  35. };
  36. //------------------------------------
  37. sampler BumpSampler = sampler_state 
  38. {
  39.   texture   = <BumpTex>;
  40.   AddressU  = WRAP;
  41.   AddressV  = WRAP;
  42.   AddressW  = WRAP;
  43.   MIPFILTER = LINEAR;
  44.   MINFILTER = LINEAR;
  45.   MAGFILTER = LINEAR;
  46. };
  47. //---------------------------------------------------------------------------
  48. sampler ShadowSampler = sampler_state
  49. {
  50.   Texture   = <SMapTex>;
  51.   MinFilter = Point;
  52.   MagFilter = Point;
  53.   MipFilter = Point;
  54.   AddressU  = Clamp;
  55.   AddressV  = Clamp;
  56. };
  57. //---------------------------------------------------------------------------
  58. // ApplyShadowMap()
  59. //
  60. // Projects the shadow map to the scene and calculates if the pixel is inside
  61. // or outside the shadow. The resulting value is in [0..1] range.
  62. //---------------------------------------------------------------------------
  63. float ApplyShadowMap(float4 ProjTex)
  64. {
  65.   // Project the texture coords and scale/offset to [0, 1].
  66.   ProjTex.xy /= ProjTex.w;            
  67.   ProjTex.x =  0.5f * ProjTex.x + 0.5f; 
  68.   ProjTex.y = -0.5f * ProjTex.y + 0.5f;
  69.   
  70.   // Compute pixel depth for shadowing.
  71.   float Depth = ProjTex.z / ProjTex.w;
  72.  
  73.   // Transform to texel space.
  74.   float2 TexelPos = SMAP_SIZE * ProjTex.xy;  
  75.   // Apply bilinear multisampling to shadow map.
  76.   #ifdef ShadowBilinearFilter
  77.   float dx = 1.0f / SMAP_SIZE;
  78.   
  79.   // -> Retreive individual shadow map samples.
  80.   float s0 = (tex2D(ShadowSampler, ProjTex.xy).r + 
  81.    SHADOW_EPSILON < Depth) ? 0.3f : 1.0f;
  82.   float s1 = (tex2D(ShadowSampler, ProjTex.xy + 
  83.    float2(dx, 0.0f)).r + SHADOW_EPSILON < Depth) ? 0.3f : 1.0f;
  84.   float s2 = (tex2D(ShadowSampler, ProjTex.xy + 
  85.    float2(0.0f, dx)).r + SHADOW_EPSILON < Depth) ? 0.3f : 1.0f;
  86.   float s3 = (tex2D(ShadowSampler, ProjTex.xy + 
  87.    float2(dx, dx)).r + SHADOW_EPSILON < Depth) ? 0.3f : 1.0f;
  88.   // Determine the lerp amounts.           
  89.   float2 Lerps = frac(TexelPos);
  90.   
  91.   return lerp(lerp(s0, s1, Lerps.x), lerp(s2, s3, Lerps.x ), Lerps.y);
  92.   #else
  93.   // Retreive a single sample from shadow map
  94.   return (tex2D(ShadowSampler, ProjTex.xy).r + SHADOW_EPSILON < Depth) ? 0.3f : 1.0f;
  95.   #endif
  96. }
  97. //---------------------------------------------------------------------------
  98. float4 ApplyPhong(float2 InTex, float3 ToEye, float3 LightDir, 
  99.  float3 NormalT, float ShadowCoef)
  100. {
  101.   float4 TexPixel = tex2D(SkinSampler, InTex);
  102.   
  103.   float SelfShadow = saturate(4.0f * LightDir.z);
  104.   
  105.   float3 Reflection = normalize(2.0f * NormalT * dot(NormalT, 
  106.    LightDir) - LightDir);
  107.    
  108.   float3 Diffuse = TexPixel.rgb * SelfShadow * saturate(dot(LightDir, NormalT));
  109.   
  110.   float3 SpecularTerm = Specular * SelfShadow * (pow(saturate(dot(Reflection, 
  111.    ToEye)), SpecPower));
  112.   
  113.   float3 AmbientTerm = Ambient * TexPixel.rgb; 
  114.     
  115.   return float4(AmbientTerm + (Diffuse + SpecularTerm) * ShadowCoef, 
  116.    TexPixel.a);
  117. }
  118. //---------------------------------------------------------------------------
  119. // ShadowBumpPhongVS()
  120. //
  121. // Vertex shader for Shadow Mapping + Bump Mapping + Phong illumination.
  122. //---------------------------------------------------------------------------
  123. void ShadowBumpPhongVS( 
  124.  float3 PositionOS: POSITION0, 
  125.  float3 TangentOS : TANGENT0,
  126.  float3 BinormalOS: BINORMAL0,
  127.  float3 NormalOS  : NORMAL0,
  128.  float2 InTex     : TEXCOORD0,
  129.  out float4 OutPos   : POSITION, 
  130.  out float2 OutTex   : TEXCOORD0,
  131.  out float4 ProjTex  : TEXCOORD1,
  132.  out float3 OutToEye   : TEXCOORD2,
  133.  out float3 OutLightDir: TEXCOORD3)
  134. {
  135.   // Compute projected texture coordinates.
  136.   float4 PosWS = mul(float4(PositionOS, 1.0f), World);
  137.   ProjTex = mul(PosWS, LightWVP);
  138.   
  139.   //float3 LightVecW = normalize(LightPos - PosWS);
  140.   //float SpotCoef = 1.0f;//pow(saturate(dot(LightVecW, LightDir)), SpotPower);
  141.   //Out
  142.     
  143.   // Transform normal, binormal and tangent vectors to world space.
  144.   float3 NormalWS   = mul(float4(NormalOS, 0.0f), WorldInverseTranspose).xyz;
  145.   float3 TangentWS  = mul(float4(TangentOS, 0.0f), WorldInverseTranspose).xyz;
  146.   float3 BinormalWS = mul(float4(BinormalOS, 0.0f), WorldInverseTranspose).xyz;
  147.   
  148.   NormalWS   = normalize(NormalWS);
  149.   TangentWS  = normalize(TangentWS);
  150.   BinormalWS = normalize(BinormalWS);
  151.   
  152.   // Compute matrix for transforming from world space to tangent space.
  153.   float3x3 ToTangent = transpose(float3x3(TangentWS, BinormalWS, NormalWS));
  154.       
  155.   // Transform light direction and vertex-to-eye vector to tangent space.
  156.   float3 LightDir = normalize(PosWS - LightPos);
  157.   
  158.   OutLightDir = mul(LightDir, ToTangent);
  159.   OutToEye    = mul(EyePos - PosWS, ToTangent);  
  160.  
  161.   // Transform vertex position. 
  162.   OutPos = mul(float4(PositionOS, 1.0f), WorldViewProjection);
  163.   
  164.   // Pass skin texture coordinates.
  165.   OutTex = mul(float3(InTex, 1.0f), TexMtx).xy;
  166. }
  167. //---------------------------------------------------------------------------
  168. // ShadowBumpPhongPS()
  169. //
  170. // Pixel shader for Shadow Mapping + Bump Mapping + Phong illumination.
  171. //---------------------------------------------------------------------------
  172. float4 ShadowBumpPhongPS(
  173.  float2 InTex   : TEXCOORD0,
  174.  float4 ProjTex : TEXCOORD1,
  175.  float3 ToEye   : TEXCOORD2,
  176.  float3 LightDir: TEXCOORD3) : COLOR
  177. {
  178.   float ShadowCoef = ApplyShadowMap(ProjTex);  
  179.   float3 NormalT = tex2D(BumpSampler, InTex);
  180.   NormalT = normalize(2.0f * NormalT - 1.0f);
  181.   
  182.   return ApplyPhong(InTex, normalize(ToEye), -normalize(LightDir),
  183.    NormalT, ShadowCoef);   
  184. }
  185. //---------------------------------------------------------------------------
  186. float4 ProjBumpPhongPS(
  187.  float2 InTex   : TEXCOORD0,
  188.  float4 ProjTex : TEXCOORD1,
  189.  float3 ToEye   : TEXCOORD2,
  190.  float3 LightDir: TEXCOORD3) : COLOR
  191. {
  192.   float3 NormalT = tex2D(BumpSampler, InTex);
  193.   NormalT = normalize(2.0f * NormalT - 1.0f);
  194.      
  195.   // Project the texture coords and scale/offset to [0, 1].
  196.   ProjTex.xy /= ProjTex.w;            
  197.   ProjTex.x =  0.5f * ProjTex.x + 0.5f; 
  198.   ProjTex.y = -0.5f * ProjTex.y + 0.5f;
  199.   float4 ShadowCol = tex2D(ShadowSampler, ProjTex.xy);
  200.   
  201.   return ApplyPhong(InTex, normalize(ToEye), -normalize(LightDir), 
  202.    NormalT, 1.0f) * ShadowCol;  
  203. }
  204. //---------------------------------------------------------------------------
  205. void BuildShadowMapVS(
  206.  float3 PosL : POSITION0,
  207.  out float4 PosH  : POSITION,
  208.  out float2 Depth : TEXCOORD0
  209.  )
  210. {
  211.   PosH  = mul(float4(PosL, 1.0f), LightWVP);
  212.   Depth = PosH.zw;
  213. }
  214. //---------------------------------------------------------------------------
  215. float4 BuildShadowMapPS(float2 Depth : TEXCOORD0) : COLOR
  216. {
  217.   return Depth.x / Depth.y;
  218. }
  219. //---------------------------------------------------------------------------
  220. technique BuildShadowMap
  221. {
  222.   pass p0
  223.   {
  224.     VertexShader = compile vs_2_0 BuildShadowMapVS();
  225.     PixelShader  = compile ps_2_0 BuildShadowMapPS();
  226.   }
  227. }
  228. //---------------------------------------------------------------------------
  229. technique ShadowBumpPhong
  230. {
  231.   pass p0
  232.   {
  233.     VertexShader = compile vs_2_0 ShadowBumpPhongVS();
  234.     PixelShader  = compile ps_2_0 ShadowBumpPhongPS();
  235.   }
  236. }
  237. //---------------------------------------------------------------------------
  238. technique ProjBumpPhong
  239. {
  240.   pass p0
  241.   {
  242.     VertexShader = compile vs_2_0 ShadowBumpPhongVS();
  243.     PixelShader  = compile ps_2_0 ProjBumpPhongPS();
  244.   }
  245. }