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

2D图形编程

开发平台:

Delphi

  1. unit CookTorranceFx;
  2. //---------------------------------------------------------------------------
  3. // CookTorranceFx.pas                                   Modified: 28-Apr-2007
  4. // Cook-Torrance reflectance shader interface                     Version 1.0
  5. //---------------------------------------------------------------------------
  6. // Important Notice:
  7. //
  8. // If you modify/use this code or one of its parts either in original or
  9. // modified form, you must comply with Mozilla Public License v1.1,
  10. // specifically section 3, "Distribution Obligations". Failure to do so will
  11. // result in the license breach, which will be resolved in the court.
  12. // Remember that violating author's rights is considered a serious crime in
  13. // many countries. Thank you!
  14. //
  15. // !! Please *read* Mozilla Public License 1.1 document located at:
  16. //  http://www.mozilla.org/MPL/
  17. //
  18. // If you require any clarifications about the license, feel free to contact
  19. // us or post your question on our forums at: http://www.afterwarp.net
  20. //---------------------------------------------------------------------------
  21. // The contents of this file are subject to the Mozilla Public License
  22. // Version 1.1 (the "License"); you may not use this file except in
  23. // compliance with the License. You may obtain a copy of the License at
  24. // http://www.mozilla.org/MPL/
  25. //
  26. // Software distributed under the License is distributed on an "AS IS"
  27. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  28. // License for the specific language governing rights and limitations
  29. // under the License.
  30. //
  31. // The Original Code is CookTorranceFx.pas.
  32. //
  33. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  34. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  35. // M. Sc. Yuriy Kotsarenko. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. uses
  40.  Direct3D9, d3dx9, Vectors2, Vectors3, Matrices4, AsphyreColors,
  41.  AsphyreDevices, AsphyreShaderFX, AsphyreMeshes;
  42. //---------------------------------------------------------------------------
  43. type
  44.  TCookTorranceFx = class(TAsphyreShaderEffect)
  45.  private
  46.   TempColor : TD3DColorValue;
  47.   TempVector: TD3DXVector3;
  48.   FShaderMode: TShaderEffectMode;
  49.   FAmbient   : Single;
  50.   FDiffuse   : TAsphyreColor;
  51.   FSpecular  : Single;
  52.   FRoughness : TPoint2;
  53.   FLightDir  : TVector3;
  54.  protected
  55.   procedure Describe(); override;
  56.   procedure UpdateParam(Code: Integer; out DataPtr: Pointer;
  57.    out DataSize: Integer); override;
  58.  public
  59.   // The working mode of effect shader.
  60.   property ShaderMode: TShaderEffectMode read FShaderMode write FShaderMode;
  61.   property Ambient : Single read FAmbient write FAmbient;
  62.   property Diffuse : TAsphyreColor read FDiffuse write FDiffuse;
  63.   property Specular: Single read FSpecular write FSpecular;
  64.   // Anisotropic roughness of specular term.
  65.   property Roughness: TPoint2 read FRoughness write FRoughness;
  66.   // The light direction vector.
  67.   property LightDir: TVector3 read FLightDir write FLightDir;
  68.   procedure Draw(Mesh: TAsphyreCustomMesh); overload;
  69.   procedure Draw(Mesh: TAsphyreCustomMesh; const World: TMatrix4;
  70.    Color: Cardinal; Ambient, Specular, RoughX, RoughY: Single); overload;
  71.   procedure UpdateTech();
  72.   constructor Create(ADevice: TAsphyreDevice);
  73.  end;
  74. //---------------------------------------------------------------------------
  75. implementation
  76. //---------------------------------------------------------------------------
  77. uses
  78.  AsphyreScene;
  79. //---------------------------------------------------------------------------
  80. const
  81.  ShdrAmbient     = 1;
  82.  ShdrDiffuse     = 2;
  83.  ShdrSpecular    = 3;
  84.  ShdrRoughnessX  = 4;
  85.  ShdrRoughnessY  = 5;
  86.  ShdrLightDir    = 6;
  87.  ShdrModeCompat  = 7;
  88.  ShdrModePerf    = 8;
  89.  ShdrModeQuality = 9;
  90. //---------------------------------------------------------------------------
  91. constructor TCookTorranceFx.Create(ADevice: TAsphyreDevice);
  92. begin
  93.  inherited;
  94.  FShaderMode := semQuality;
  95.  FAmbient    := 0.1;
  96.  FDiffuse    := $FFFFFF;
  97.  FSpecular   := 1.0;
  98.  FRoughness  := Point2(0.85, 0.90);
  99.  FLightDir:= Norm3(Vector3(1.0, 1.0, 1.0));
  100. end;
  101. //---------------------------------------------------------------------------
  102. procedure TCookTorranceFx.Describe();
  103. begin
  104.  DescParam(sptWorldViewProjection,   'WorldViewProjection');
  105.  DescParam(sptWorldInverseTranspose, 'WorldInverseTranspose');
  106.  DescParam(sptCameraPosition,        'EyePos');
  107.  DescParam(sptWorld,                 'World');
  108.  DescParam(sptCustom, 'Ambient',  ShdrAmbient);
  109.  DescParam(sptCustom, 'Diffuse',  ShdrDiffuse);
  110.  DescParam(sptCustom, 'Specular', ShdrSpecular);
  111.  DescParam(sptCustom, 'RoughnessX', ShdrRoughnessX);
  112.  DescParam(sptCustom, 'RoughnessY', ShdrRoughnessY);
  113.  DescParam(sptCustom, 'LightDir', ShdrLightDir);
  114.  DescTechnique('CompatTech',  ShdrModeCompat);
  115.  DescTechnique('PerfTech',    ShdrModePerf);
  116.  DescTechnique('QualityTech', ShdrModeQuality);
  117. end;
  118. //---------------------------------------------------------------------------
  119. procedure TCookTorranceFx.UpdateParam(Code: Integer; out DataPtr: Pointer;
  120.  out DataSize: Integer);
  121. begin
  122.  case Code of
  123.   ShdrAmbient:
  124.    begin
  125.     DataPtr := @FAmbient;
  126.     DataSize:= SizeOf(Single);
  127.    end;
  128.   ShdrDiffuse:
  129.    begin
  130.     TempColor:= FDiffuse;
  131.     DataPtr := @TempColor;
  132.     DataSize:= SizeOf(TD3DColorValue) - SizeOf(Single);
  133.    end;
  134.   ShdrSpecular:
  135.    begin
  136.     DataPtr := @FSpecular;
  137.     DataSize:= SizeOf(Single);
  138.    end;
  139.   ShdrRoughnessX:
  140.    begin
  141.     DataPtr := @FRoughness.x;
  142.     DataSize:= SizeOf(Single);
  143.    end;
  144.   ShdrRoughnessY:
  145.    begin
  146.     DataPtr := @FRoughness.y;
  147.     DataSize:= SizeOf(Single);
  148.    end;
  149.   ShdrLightDir:
  150.    begin
  151.     TempVector:= TD3DXVector3(-Norm3(FLightDir));
  152.     DataPtr := @TempVector;
  153.     DataSize:= SizeOf(TD3DXVector3);
  154.    end;
  155.  end;
  156. end;
  157. //---------------------------------------------------------------------------
  158. procedure TCookTorranceFx.UpdateTech();
  159. begin
  160.  case FShaderMode of
  161.   semCompatibility:
  162.    UseTechnique(ShdrModeCompat);
  163.   semPerformance:
  164.    UseTechnique(ShdrModePerf);
  165.   semQuality:
  166.    UseTechnique(ShdrModeQuality);
  167.  end;
  168. end;
  169. //---------------------------------------------------------------------------
  170. procedure TCookTorranceFx.Draw(Mesh: TAsphyreCustomMesh);
  171. var
  172.  PassNo: Integer;
  173. begin
  174.  for PassNo:= 0 to NumPasses - 1 do
  175.   begin
  176.    if (not BeginPass(PassNo)) then Break;
  177.    Mesh.Draw();
  178.    EndPass();
  179.   end;
  180. end;
  181. //---------------------------------------------------------------------------
  182. procedure TCookTorranceFx.Draw(Mesh: TAsphyreCustomMesh;
  183.  const World: TMatrix4; Color: Cardinal; Ambient, Specular, RoughX,
  184.  RoughY: Single);
  185. begin
  186.  FRoughness.x:= RoughX;
  187.  FRoughness.y:= RoughY;
  188.  FAmbient := Ambient;
  189.  FDiffuse := Color;
  190.  FSpecular:= Specular;
  191.  WorldMtx.LoadMtx(@World);
  192.  UpdateAll();
  193.  Draw(Mesh);
  194. end;
  195. //---------------------------------------------------------------------------
  196. end.