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

2D图形编程

开发平台:

Delphi

  1. unit BumpMappingFx;
  2. //---------------------------------------------------------------------------
  3. // BumpMappingFx.pas                                    Modified: 30-Apr-2007
  4. // Shader interface for bump-mapping with phong reflection        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 BumpMappingFx.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, AsphyreTextures,
  42.  AsphyreImages, Matrices3;
  43. //---------------------------------------------------------------------------
  44. type
  45.  TBumpMappingFx = class(TAsphyreShaderEffect)
  46.  private
  47.   TempColor : TD3DColorValue;
  48.   TempVector: TD3DXVector3;
  49.   FShaderMode   : TShaderEffectMode;
  50.   FAmbientColor : TAsphyreColor;
  51.   FDiffuseColor : TAsphyreColor;
  52.   FSpecularColor: TAsphyreColor;
  53.   FSpecularPower: Single;
  54.   FLightVector  : TVector3;
  55.   FSkinTexture: TAsphyreCustomTexture;
  56.   FBumpTexture : TAsphyreCustomTexture;
  57.   FSkinMtx: TMatrix3;
  58.   FBumpMtx: TMatrix3;
  59.  protected
  60.   procedure Describe(); override;
  61.   procedure UpdateParam(Code: Integer; out DataPtr: Pointer;
  62.    out DataSize: Integer); override;
  63.   procedure UpdateTexture(Code: Integer;
  64.    out ParamTex: IDirect3DTexture9); override;
  65.  public
  66.   // The working mode of effect shader.
  67.   property ShaderMode: TShaderEffectMode read FShaderMode write FShaderMode;
  68.   // The light and illumination colors.
  69.   property AmbientColor : TAsphyreColor read FAmbientColor write FAmbientColor;
  70.   property DiffuseColor : TAsphyreColor read FDiffuseColor write FDiffuseColor;
  71.   property SpecularColor: TAsphyreColor read FSpecularColor write FSpecularColor;
  72.   // Texture transformation matrices.
  73.   property SkinMtx: TMatrix3 read FSkinMtx write FSkinMtx;
  74.   property BumpMtx: TMatrix3 read FBumpMtx write FBumpMtx;
  75.   // Anisotropic roughness of specular term.
  76.   property SpecularPower: Single read FSpecularPower write FSpecularPower;
  77.   // The light direction vector.
  78.   property LightVector: TVector3 read FLightVector write FLightVector;
  79.   // The diffuse texture to skin the mesh with.
  80.   property SkinTexture: TAsphyreCustomTexture read FSkinTexture write FSkinTexture;
  81.   // The bump-mapping texture containing normal information.
  82.   property BumpTexture: TAsphyreCustomTexture read FBumpTexture write FBumpTexture;
  83.   procedure Draw(Mesh: TAsphyreCustomMesh); overload;
  84.   procedure Draw(Mesh: TAsphyreCustomMesh; const World: TMatrix4;
  85.    SkinTex, BumpTex: TAsphyreCustomImage); overload;
  86.   constructor Create(ADevice: TAsphyreDevice);
  87.  end;
  88. //---------------------------------------------------------------------------
  89. implementation
  90. //---------------------------------------------------------------------------
  91. uses
  92.  AsphyreScene;
  93. //---------------------------------------------------------------------------
  94. const
  95.  ShdrAmbientColor  = 1;
  96.  ShdrDiffuseColor  = 2;
  97.  ShdrSpecularColor = 3;
  98.  ShdrSpecularPower = 4;
  99.  ShdrLightVector   = 5;
  100.  ShdrSkinMtx       = 6;
  101.  ShdrBumpMtx       = 7;
  102.  ShdrSkinTexture   = 8;
  103.  ShdrBumpTexture   = 9;
  104. //---------------------------------------------------------------------------
  105. constructor TBumpMappingFx.Create(ADevice: TAsphyreDevice);
  106. begin
  107.  inherited;
  108.  FShaderMode   := semQuality;
  109.  FAmbientColor := $202020;
  110.  FDiffuseColor := $FFFFFFFF;
  111.  FSpecularColor:= $FFFFFF;
  112.  FSpecularPower:= 8.0;
  113.  FLightVector  := Norm3(Vector3(1.0, 1.0, 1.0));
  114.  FSkinMtx:= IdentityMtx3;
  115.  FBumpMtx:= IdentityMtx3;
  116. end;
  117. //---------------------------------------------------------------------------
  118. procedure TBumpMappingFx.Describe();
  119. begin
  120.  DescParam(sptWorldViewProjection,   'WorldViewProjection');
  121.  DescParam(sptWorldInverseTranspose, 'WorldInverseTranspose');
  122.  DescParam(sptWorldInverse,          'WorldInverse');
  123.  DescParam(sptWorld,                 'World');
  124.  DescParam(sptCameraPosition,        'EyePos');
  125.  DescParam(sptCustom, 'AmbientColor',  ShdrAmbientColor);
  126.  DescParam(sptCustom, 'DiffuseColor',  ShdrDiffuseColor);
  127.  DescParam(sptCustom, 'SpecularColor', ShdrSpecularColor);
  128.  DescParam(sptCustom, 'SpecularPower', ShdrSpecularPower);
  129.  DescParam(sptCustom, 'LightVector',   ShdrLightVector);
  130.  DescParam(sptCustom, 'SkinMtx', ShdrSkinMtx);
  131.  DescParam(sptCustom, 'BumpMtx', ShdrBumpMtx);
  132.  DescParam(sptTexture, 'SkinTexture',  ShdrSkinTexture);
  133.  DescParam(sptTexture, 'BumpTexture',  ShdrBumpTexture);
  134. end;
  135. //---------------------------------------------------------------------------
  136. procedure TBumpMappingFx.UpdateParam(Code: Integer; out DataPtr: Pointer;
  137.  out DataSize: Integer);
  138. begin
  139.  case Code of
  140.   ShdrAmbientColor:
  141.    begin
  142.     TempColor:= FAmbientColor;
  143.     DataPtr := @TempColor;
  144.     DataSize:= SizeOf(TD3DColorValue) - SizeOf(Single);
  145.    end;
  146.   ShdrDiffuseColor:
  147.    begin
  148.     TempColor:= FDiffuseColor;
  149.     DataPtr := @TempColor;
  150.     DataSize:= SizeOf(TD3DColorValue);
  151.    end;
  152.   ShdrSpecularColor:
  153.    begin
  154.     TempColor:= FSpecularColor;
  155.     DataPtr := @TempColor;
  156.     DataSize:= SizeOf(TD3DColorValue) - SizeOf(Single);
  157.    end;
  158.   ShdrSpecularPower:
  159.    begin
  160.     DataPtr := @FSpecularPower;
  161.     DataSize:= SizeOf(Single);
  162.    end;
  163.   ShdrLightVector:
  164.    begin
  165.     TempVector:= TD3DXVector3(Norm3(FLightVector));
  166.     DataPtr := @TempVector;
  167.     DataSize:= SizeOf(TD3DXVector3);
  168.    end;
  169.   ShdrSkinMtx:
  170.    begin
  171.     DataPtr := @FSkinMtx;
  172.     DataSize:= SizeOf(TMatrix3);
  173.    end;
  174.   ShdrBumpMtx:
  175.    begin
  176.     DataPtr := @FBumpMtx;
  177.     DataSize:= SizeOf(TMatrix3);
  178.    end;
  179.  end;
  180. end;
  181. //---------------------------------------------------------------------------
  182. procedure TBumpMappingFx.UpdateTexture(Code: Integer;
  183.  out ParamTex: IDirect3DTexture9);
  184. begin
  185.  ParamTex:= nil;
  186.  case Code of
  187.   ShdrSkinTexture:
  188.    if (FSkinTexture <> nil) then ParamTex:= FSkinTexture.Tex9;
  189.   ShdrBumpTexture:
  190.    if (FBumpTexture <> nil) then ParamTex:= FBumpTexture.Tex9;
  191.  end;
  192. end;
  193. //---------------------------------------------------------------------------
  194. procedure TBumpMappingFx.Draw(Mesh: TAsphyreCustomMesh);
  195. var
  196.  PassNo: Integer;
  197. begin
  198.  for PassNo:= 0 to NumPasses - 1 do
  199.   begin
  200.    if (not BeginPass(PassNo)) then Break;
  201.    Mesh.Draw();
  202.    EndPass();
  203.   end;
  204. end;
  205. //---------------------------------------------------------------------------
  206. procedure TBumpMappingFx.Draw(Mesh: TAsphyreCustomMesh;
  207.  const World: TMatrix4; SkinTex, BumpTex: TAsphyreCustomImage);
  208. begin
  209.  FSkinTexture:= nil;
  210.  if (SkinTex <> nil) then FSkinTexture:= SkinTex.Texture[0];
  211.  FBumpTexture:= nil;
  212.  if (BumpTex <> nil) then FBumpTexture:= BumpTex.Texture[0];
  213.  
  214.  WorldMtx.LoadMtx(@World);
  215.  UpdateAll();
  216.  Draw(Mesh);
  217. end;
  218. //---------------------------------------------------------------------------
  219. end.