![]() ![]() ![]() |
|
![]() |
|
![]() |
![]() ![]() ![]() |
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.
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; |
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.