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

2D图形编程

开发平台:

Delphi

  1. //---------------------------------------------------------------------------
  2. // Cook-Torrance reflection model
  3. // Original code by Jack Hoxley posted at http://www.GameDev.Net
  4. // Modifications by Yuriy Kotsarenko (ykot@inbox.com)
  5. //---------------------------------------------------------------------------
  6. uniform extern float4x4 WorldInverseTranspose : WorldInverseTranspose;
  7. uniform extern float4x4 WorldViewProjection : WorldViewProjection;
  8. uniform extern float4x4 World  : World;
  9. uniform extern float3   EyePos : CameraPosition;
  10. //---------------------------------------------------------------------------
  11. uniform extern float Ambient
  12. <
  13.   string UIWidget = "slider";
  14.   float  UIMin  = -0.5;
  15.   float  UIMax  = 1.5;
  16.   float  UIStep = 0.01;
  17.   string UIName = "Ambient";
  18. > = 0.1;
  19. //---------------------------------------------------------------------------
  20. uniform extern float3 Diffuse : Diffuse
  21. <
  22.   string UIName   = "DiffuseColor";
  23.   string UIWidget = "Color";
  24. > = {0.0f, 0.0f, 1.0f};
  25. //---------------------------------------------------------------------------
  26. uniform extern float Specular
  27. <
  28.   string UIWidget = "slider";
  29.   float  UIMin  = -1.0;
  30.   float  UIMax  = 5.0;
  31.   float  UIStep = 0.01;
  32.   string UIName = "Specular";
  33. > = 1.5;
  34. //---------------------------------------------------------------------------
  35. uniform extern float RoughnessX
  36. <
  37.   string UIWidget = "slider";
  38.   float  UIMin  = 0.0;
  39.   float  UIMax  = 2.0;
  40.   float  UIStep = 0.01;
  41.   string UIName = "RoughnessX";
  42. > = 0.85;
  43. //---------------------------------------------------------------------------
  44. uniform extern float RoughnessY
  45. <
  46.   string UIWidget = "slider";
  47.   float  UIMin  = 0.0;
  48.   float  UIMax  = 2.0;
  49.   float  UIStep = 0.01;
  50.   string UIName = "RoughnessY";
  51. > = 0.9;
  52. //---------------------------------------------------------------------------
  53. uniform extern float3 LightDir : Direction
  54. <
  55.   string Object = "DirectionalLight";
  56.   string Space = "World";
  57. > = {1.0f, -1.0f, 1.0f};
  58. //---------------------------------------------------------------------------
  59. float4 ApplyCookTorrance(float3 NormalW, float3 PosW)
  60. {
  61.   float3 RoughnessParams = {0.5f, 0.5f, 0.5f};
  62.   float3 ViewDir        = normalize(EyePos - PosW);
  63.   float3 vHalf          = normalize(LightDir + ViewDir);
  64.   float  NormalDotHalf  = dot(NormalW, vHalf);
  65.   float  ViewDotHalf    = dot(vHalf,  ViewDir);
  66.   float  NormalDotView  = dot(NormalW, ViewDir);
  67.   float  NormalDotLight = dot(NormalW, LightDir);
  68.   
  69.   // Compute the geometric term
  70.   float  G1 = (2.0f * NormalDotHalf * NormalDotView) / ViewDotHalf;
  71.   float  G2 = (2.0f * NormalDotHalf * NormalDotLight) / ViewDotHalf;
  72.   float  G  = min(1.0f, max(0.0f, min(G1, G2)));
  73.   
  74.   // Compute the fresnel term
  75.   float  F = RoughnessY + (1.0f - RoughnessY) * 
  76.    pow(1.0f - NormalDotView, 5.0f);
  77.   
  78.   // Compute the roughness term
  79.   float  R_2     = RoughnessX * RoughnessX;
  80.   float  NDotH_2 = NormalDotHalf * NormalDotHalf;
  81.   float  A       = 1.0f / (4.0f * R_2 * NDotH_2 * NDotH_2);
  82.   float  B       = exp(-(1.0f - NDotH_2) / (R_2 * NDotH_2));
  83.   float  R       = A * B;
  84.   float Irradiance = max(0.0f, NormalDotLight);
  85.   
  86.   // Compute the final term
  87.   float SpecularTerm = Specular * Irradiance * G * F * R / 
  88.    (NormalDotLight * NormalDotView);
  89.    
  90.   float3 DiffuseTerm = Diffuse * (Ambient + Irradiance);
  91.    
  92.   return float4(DiffuseTerm + SpecularTerm, 1.0f);
  93. }
  94. //---------------------------------------------------------------------------
  95. void PerfVS(
  96.  float3 PosL   : POSITION0, 
  97.  float3 NormalL: NORMAL0,
  98.  out float4 PosH: POSITION, 
  99.  out float4 Col : COLOR)
  100. {
  101.   float3 NormalW = mul(float4(NormalL, 0.0f), WorldInverseTranspose).xyz;
  102.   NormalW = normalize(NormalW);
  103.   
  104.   float3 PosW = mul(float4(PosL, 1.0f), World);
  105.   /*float3 LightToPos = normalize(LightPos - PosW);
  106.   
  107.   float Spot = saturate(pow(saturate(dot(LightToPos, -LightVector)), 4.0) * 4);*/
  108.   
  109.   PosH = mul(float4(PosL, 1.0f), WorldViewProjection);
  110. //  Col  = ApplyCookTorrance(NormalW, PosW, LightToPos) * Spot;
  111.   Col  = ApplyCookTorrance(NormalW, PosW);
  112. }
  113. //---------------------------------------------------------------------------
  114. void QualityVS(
  115.  float3 PosL    : POSITION0, 
  116.  float3 NormalL : NORMAL0,
  117.  out float4 PosH       : POSITION, 
  118.  out float3 NormalW    : TEXCOORD0, 
  119.  out float3 PosW       : TEXCOORD1
  120. // out float3 LightToPos : TEXCOORD2
  121. // out float2  Spot       : TEXCOORD3
  122.  )
  123. {
  124.   NormalW    = mul(float4(NormalL, 0.0f), WorldInverseTranspose).xyz;
  125.   PosW       = mul(float4(PosL, 1.0f), World);
  126. //  LightToPos = normalize(LightPos - PosW);
  127.   //Spot = pow(saturate(dot(LightToPos, -LightVector)), 4.0) * 4;
  128.   PosH = mul(float4(PosL, 1.0f), WorldViewProjection);
  129. }
  130. //---------------------------------------------------------------------------
  131. float4 QualityPS(
  132.  float3 NormalW : TEXCOORD0, 
  133.  float3 PosW    : TEXCOORD1
  134. // float3 LightToPos : TEXCOORD2
  135.  /*float2  Spot : TEXCOORD3*/
  136.  ): COLOR
  137. {
  138. //  float Spot = pow(saturate(dot(normalize(LightToPos), -LightVector)), 4.0) * 4;
  139. /*  return ApplyCookTorrance(normalize(NormalW), PosW, normalize(LightToPos)) * 
  140.    saturate(Spot);*/
  141.   return ApplyCookTorrance(normalize(NormalW), PosW);
  142.    
  143. }
  144. //---------------------------------------------------------------------------
  145. technique CompatTech
  146. {
  147.   pass p0 
  148.   {
  149.     VertexShader = compile vs_1_1 PerfVS();
  150.   }
  151. }
  152. //---------------------------------------------------------------------------
  153. technique PerfTech
  154. {
  155.   pass p0 
  156.   {
  157.     VertexShader = compile vs_2_0 PerfVS();
  158.   }
  159. }
  160. //---------------------------------------------------------------------------
  161. technique QualityTech
  162. {
  163.   pass p0 
  164.   {
  165.     VertexShader = compile vs_2_0 QualityVS();
  166.     PixelShader  = compile ps_2_0 QualityPS();
  167.   }
  168. }