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

2D图形编程

开发平台:

Delphi

  1. unit AsphyreBasicShaders;
  2. //---------------------------------------------------------------------------
  3. // AsphyreBasicShaders.pas                              Modified: 09-Apr-2007
  4. // High-level wrapper for basic Asphyre shader effect             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 AsphyreBasicShaders.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, Vectors3, Matrices4, AsphyreColors, AsphyreDevices,
  41.  AsphyreShaderFX, AsphyreMeshes;
  42. //---------------------------------------------------------------------------
  43. type
  44.  TAsphyreShadingType = (astGouraud, astPhong);
  45. //---------------------------------------------------------------------------
  46.  TAsphyreBasicShader = class(TAsphyreShaderEffect)
  47.  private
  48.   TempColorValue: TD3DColorValue;
  49.   TempLightVec  : TD3DXVector3;
  50.   FAmbientColor : TAsphyreColor;
  51.   FDiffuseColor : TAsphyreColor;
  52.   FSpecularColor: TAsphyreColor;
  53.   FSpecularPower: Single;
  54.   FLightVector  : TVector3;
  55.   FShadingType  : TAsphyreShadingType;
  56.  protected
  57.   procedure Describe(); override;
  58.   procedure UpdateParam(Code: Integer; out DataPtr: Pointer;
  59.    out DataSize: Integer); override;
  60.  public
  61.   property AmbientColor : TAsphyreColor read FAmbientColor write FAmbientColor;
  62.   property DiffuseColor : TAsphyreColor read FDiffuseColor write FDiffuseColor;
  63.   property SpecularColor: TAsphyreColor read FSpecularColor write FSpecularColor;
  64.   property SpecularPower: Single read FSpecularPower write FSpecularPower;
  65.   property LightVector  : TVector3 read FLightVector write FLightVector;
  66.   property ShadingType  : TAsphyreShadingType read FShadingType write FShadingType;
  67.   procedure Draw(Mesh: TAsphyreCustomMesh);
  68.   procedure DrawCol(Mesh: TAsphyreCustomMesh; const World: TMatrix4;
  69.    Color: Cardinal);
  70.   procedure DrawColSpec(Mesh: TAsphyreCustomMesh; const World: TMatrix4;
  71.    Diffuse, Specular: Cardinal);
  72.   procedure Update(); override;
  73.   constructor Create(ADevice: TAsphyreDevice);
  74.  end;
  75. //---------------------------------------------------------------------------
  76. implementation
  77. //---------------------------------------------------------------------------
  78. uses
  79.  AsphyreScene;
  80. //---------------------------------------------------------------------------
  81. const
  82.  ShdrAmbientColor  = 1;
  83.  ShdrDiffuseColor  = 2;
  84.  ShdrSpecularColor = 3;
  85.  ShdrSpecularPower = 4;
  86.  ShdrLightVector   = 5;
  87.  ShdrGouraud       = 6;
  88.  ShdrPhong         = 7;
  89. //---------------------------------------------------------------------------
  90. constructor TAsphyreBasicShader.Create(ADevice: TAsphyreDevice);
  91. begin
  92.  inherited;
  93.  FAmbientColor := $FF202020;
  94.  FDiffuseColor := $FF00FF00;
  95.  FSpecularColor:= $FFFFFFFF;
  96.  FSpecularPower:= 20.0;
  97.  FLightVector  := Norm3(Vector3(1.0, 1.0, 1.0));
  98. end;
  99. //---------------------------------------------------------------------------
  100. procedure TAsphyreBasicShader.Describe();
  101. begin
  102.  DescParam(sptWorldViewProjection,   'WorldViewProjection');
  103.  DescParam(sptWorldInverseTranspose, 'WorldInverseTranspose');
  104.  DescParam(sptCameraPosition,        'CameraPos');
  105.  DescParam(sptWorld,                 'World');
  106.  DescParam(sptCustom, 'AmbientColor',  ShdrAmbientColor);
  107.  DescParam(sptCustom, 'DiffuseColor',  ShdrDiffuseColor);
  108.  DescParam(sptCustom, 'SpecularColor', ShdrSpecularColor);
  109.  DescParam(sptCustom, 'SpecularPower', ShdrSpecularPower);
  110.  DescParam(sptCustom, 'LightVector',   ShdrLightVector);
  111.  DescTechnique('GouraudShading', ShdrGouraud);
  112.  DescTechnique('PhongShading',   ShdrPhong);
  113. end;
  114. //---------------------------------------------------------------------------
  115. procedure TAsphyreBasicShader.UpdateParam(Code: Integer; out DataPtr: Pointer;
  116.  out DataSize: Integer);
  117. begin
  118.  case Code of
  119.   ShdrAmbientColor:
  120.    begin
  121.     TempColorValue:= FAmbientColor;
  122.     DataPtr := @TempColorValue;
  123.     DataSize:= SizeOf(TD3DColorValue);
  124.    end;
  125.   ShdrDiffuseColor:
  126.    begin
  127.     TempColorValue:= FDiffuseColor;
  128.     DataPtr := @TempColorValue;
  129.     DataSize:= SizeOf(TD3DColorValue);
  130.    end;
  131.   ShdrSpecularColor:
  132.    begin
  133.     TempColorValue:= FSpecularColor;
  134.     DataPtr := @TempColorValue;
  135.     DataSize:= SizeOf(TD3DColorValue);
  136.    end;
  137.   ShdrSpecularPower:
  138.    begin
  139.     DataPtr := @FSpecularPower;
  140.     DataSize:= SizeOf(Single);
  141.    end;
  142.   ShdrLightVector:
  143.    begin
  144.     TempLightVec:= TD3DXVector3(-Norm3(FLightVector));
  145.     DataPtr := @TempLightVec;
  146.     DataSize:= SizeOf(TD3DXVector3);
  147.    end;
  148.  end;
  149. end;
  150. //---------------------------------------------------------------------------
  151. procedure TAsphyreBasicShader.Update();
  152. begin
  153.  inherited;
  154.  case FShadingType of
  155.   astGouraud:
  156.    UseTechnique(ShdrGouraud);
  157.   astPhong:
  158.    UseTechnique(ShdrPhong);
  159.  end;
  160. end;
  161. //---------------------------------------------------------------------------
  162. procedure TAsphyreBasicShader.Draw(Mesh: TAsphyreCustomMesh);
  163. var
  164.  PassNo: Integer;
  165. begin
  166.  for PassNo:= 0 to NumPasses - 1 do
  167.   begin
  168.    if (not BeginPass(PassNo)) then Break;
  169.    Mesh.Draw();
  170.    EndPass();
  171.   end;
  172. end;
  173. //---------------------------------------------------------------------------
  174. procedure TAsphyreBasicShader.DrawCol(Mesh: TAsphyreCustomMesh;
  175.  const World: TMatrix4; Color: Cardinal);
  176. begin
  177.  WorldMtx.LoadMtx(@World);
  178.  DiffuseColor := Color;
  179.  AmbientColor := cBlend(0, Color, 32);
  180.  SpecularColor:= $FFFFFFFF;
  181.  UpdateAll();
  182.  Draw(Mesh);
  183. end;
  184. //---------------------------------------------------------------------------
  185. procedure TAsphyreBasicShader.DrawColSpec(Mesh: TAsphyreCustomMesh;
  186.  const World: TMatrix4; Diffuse, Specular: Cardinal);
  187. begin
  188.  WorldMtx.LoadMtx(@World);
  189.  DiffuseColor := Diffuse;
  190.  AmbientColor := cBlend(0, Diffuse, 32);
  191.  SpecularColor:= Specular;
  192.  UpdateAll();
  193.  Draw(Mesh);
  194. end;
  195. //---------------------------------------------------------------------------
  196. end.