SelfDXD von Martin Pyka
SelfDXD --- DirectXGraphic --- Direct3D Rahmeneinstellungen
Viewports
Was ist ein Viewport?
Einstellen eines neuen Viewports
Eventuelle Probleme

Was ist ein Viewport?

Der Viewport ist der Bereich auf dem Bildschirm, in dem die 3D-Szene gerendert wird. Im Vollbildmodus ist das also der ganze Bildschirminhalt und im Fenstermodus standardmässig das ganze Fenster. Doch Sie können die Grösse des Viewports im Fenstermodus auch selbst einstellen. Die Szene wird dann entsprechend den Grössenverhältnissen skaliert.

Wenn Sie dem Direct3DDevice das Handle ihres Fenster übergeben, dann greift DirectXGraphics auch auf das ganze Fenster zu. Mit Viewports können Sie lediglich bestimmen in welchem Teil des Fensters der Rendervorgang stattfinden soll. Viewports sind praktisch, wenn Sie neben der 3D-Szene das Fenster beispielsweise auch noch für andere visuelle Komponenten, wie Buttons etc. nutzen wollen. Desweiteren können Sie vor dem Aufruf der .Present-Funktion die Viewport-Einstellungen ändern und somit an verschiedenen Stellen des Fensters mehrere unterschiedliche Szenen zeigen. Das ist zum Beispiel nützlich, wenn Sie sich einen 3D-Modeller programmieren und ein 3D Objekt von mehreren Seiten gleichzeitig betrachten wollen.


Einstellen eines neuen Viewports

Standardmässig nutzt DirectXGraphics die ganze Fläche des gehandelten Fensters. Mit dieser Funktion des Direct3DDevices können Sie jedoch den Viewport neu einstellen.


function SetViewport(var pViewport : TD3DViewport8) : HResult;

pViewport: Ein Record vom Typ D3DVIEWPORT8.

Der Einsatz des Viewports in der Praxis könnte zum Beispiel so aussehen:


var
  d3ddev8: TDirect3DDevice8;

function GetViewport( _x, _y, _width, _height: LongWord; _minz, _maxz: Single): TD3DViewPort8;
begin
  with result do
  begin
    x      := _x;
    y      := _y;
    width  := _width;
    height := _height;
    minz   := _minz;
    maxz   := _maxz;
  end;
end;

procedure IrgendeineProzedur;
var
  d3dvp8: TD3DViewport8;
begin
  // vorrausgehender Quelltext

  d3dvp8 := GetViewPort( 8, 16, 315, 240, 0.0, 1.0  );
  d3ddev8.SetViewport( d3dvp8 );

  // folgender Quelltext
end;

Auslesen können Sie den aktuellen Viewport mit der entsprechenden Get-Funktion des Devices.


function GetViewport(out pViewport : TD3DViewport8) : HResult;

Eventuelle Probleme

Wenn Ihr Viewport kleiner ist als die eigentliche Fenster- bzw. Komponentenfläche, dann kann es gelegentlich vorkommen, dass Bereiche ausserhalb des Viewports verzerrte Bildfetzen enthalten. Dies kann passieren, wenn der Speicherbereich, in dem sich der Backbuffer befindet, noch alte Bildreste aus anderen Anwendungen enthält. Ein sauberes Fenster können Sie zum Beispiel mit folgendem Trick erhalten:


procedure IrgendeineProzedur;
var
  d3dvp8: TD3DViewport8;
begin
  // vorrausgehender Quelltext

  d3ddev8.Clear( 0, nil, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 192, 192, 192 ), 1.0, 1 );
  d3dvp8 := GetViewPort( 8, 16, 315, 240, 0.0, 1.0  );
  d3ddev8.SetViewport( d3dvp8 );

  // folgender Quelltext
end;

Der Code lehnt an das vorrausgehende Beispiel an. Da vor der .Clear-Funktion noch kein neuer Viewport gesetzt wurde wird die gesamte Fläche mit dem Windows-Standardgrau gelöscht. Danach wird der neue Viewport eingestellt.