SelfDXD von Martin Pyka
SelfDXD --- DirectXGraphic --- Programme / Quellcodes / Klassen
Licht: Direktes Licht über Funktionen einstellen
Einleitung
SetDirectionalLight( )
SetSpotLight( )
SetPointLight( )

Einleitung

Das Einstellen einer Lichtquelle erfordert das Ausfüllen eines speziellen Records, welches dem Device übergeben wird. Damit Sie sich das aufwendige Parameter-dem-Record-zuweisen sparen können, kopieren Sie einfach die folgenden Funktionen in Ihr Programm rein. Sie müssen dann lediglich nur eine dieser drei Funktionen auswählen, dieser alle nötigen Parameter übergeben, und sich ansonsten um nichts mehr kümmern.

Beachten Sie jedoch, dass Sie, wenn Sie die nachfolgenden Codes übernehmen, gegebenenfalls den Namen des Direct3DDevice8 ändern müssen.


SetDirectionalLight( )

Diese Funktion erzeugt ein gradliniges Licht:


procedure SetDirectionalLight( _dr, _dg, _db,
                               _ar, _ag, _ab,
                               _sr, _sg, _sb: Single;
                               _dir : TD3DXVector3;
                               _index: integer );
var
  light : TD3DLIGHT8;
begin
  ZeroMemory( @light, sizeof( TD3DLIGHT8 ) );

  with light do
  begin
    _Type := D3DLIGHT_DIRECTIONAL;
    Diffuse.r := _dr;
    Diffuse.g := _dg;
    Diffuse.b := _db;
    Ambient.r := _ar;
    Ambient.g := _ag;
    Ambient.b := _ab;
    Specular.r := _sr;
    Specular.g := _sg;
    Specular.b := _sb;
    Direction := _dir;
  end;
  d3ddev8.SetLight( _index, light );
end;

SetSpotLight( )

Diese Funktion erzeugt ein Spotlight.


procedure SetSpotLight( _dr, _dg, _db,
                        _ar, _ag, _ab,
                        _sr, _sg, _sb,
                        _at0, _at1, _at2: Single;
                        _pos, _Dir: TD3DXVector3;
                        _theta, _phi,
                        _falloff, _range: single;
                        _index: cardinal);
var
  light : TD3DLIGHT8;
begin
  ZeroMemory( @light, Sizeof( TD3DLIGHT8 ) );
  with light do begin
    _Type := D3DLIGHT_SPOT;
    Diffuse.r := _dr;
    Diffuse.g := _dg;
    Diffuse.b := _db;
    Ambient.r := _ar;
    Ambient.g := _ag;
    Ambient.b := _ab;
    Specular.r := _sr;
    Specular.g := _sg;
    Specular.b := _sb;
    attenuation0 := _at0;
    attenuation1 := _at1;
    attenuation2 := _at2;
    position := _pos;
    direction := _dir;
    theta := _theta;
    phi := _phi;
    falloff := _falloff;
    range := _range;
  end;
  d3ddev8.SetLight( _index, light );
end;

SetPointLight( )

Diese Funktion erzeugt ein Punktlicht.


procedure SetPointLight( _dr, _dg, _db,
                         _ar, _ag, _ab,
                         _sr, _sg, _sb,
                         _at0, _at1, _at2,
                         _range: single;
                         _pos: TD3DXVector3;
                         _index: integer );
var
  light : TD3DLIGHT8;
begin
  ZeroMemory( @light, Sizeof( TD3DLIGHT8 ) );

  with light do
  begin
    _Type := D3DLIGHT_POINT;
    Diffuse.r := _dr;
    Diffuse.g := _dg;
    Diffuse.b := _db;
    Ambient.r := _ar;
    Ambient.g := _ag;
    Ambient.b := _ab;
    Specular.r := _sr;
    Specular.g := _sg;
    Specular.b := _sb;
    attenuation0 := _at0;
    attenuation1 := _at1;
    attenuation2 := _at2;
    range := _range;
    position := _pos;
  end;
  d3ddev8.SetLight( _index, light );
end;