![]() ![]() ![]() |
|
![]() |
|
![]() |
![]() ![]() ![]() ![]() |
Das Direct3DDevice ist sozusagen die Bühne Ihres Theaterstückes. So, wie Sie als Regisseur im Theater bestimmen können, wie weit der Vorhang geöffnet, die Szene beleuchtet und die Darsteller positioniert sein sollen, so können Sie mit dem Device von der Auflösung des Bildschirms über die Beleuchtung, die Texturzuweisung bis hin zur Kameraeinstellung alles nötige einstellen. Das Device ist sozusagen Ihr Ansprechpartner in Sachen Präsentation und bietet dafür eine Fülle an Einstellungsmöglichkeiten. Fast alles, was Sie im grafischen Bereich einstellen möchten funktioniert über dieses Device.
Bevor wir jedoch dieses Device nutzen können, müssen wir es zuerst initialisieren, d.h. also mal wieder einer Variablen dieses Device zuweisen und es so einstellen, wie wir es für unsere Bedürfnisse brauchen. Dieses Kapitel beschäftigt sich also nur mit dem Initialisieren des Direct3DDevice. Es wird aber noch Bestandteil vieler weiterer Kapitel sein.
Falls Sie glauben sollten, dass man mit diesem simplen Befehl mal eben das Device kreiert, dann haben Sie nur zum Teil Recht. Tatsächlich ist dies der Schlüsselbefehl, mit dem die Initialisierung erfolgt. Doch dieser Funktion werden Parameter zugewiesen, die wir erstmal genauer kennenlernen müssen. Die Syntax dieses Befehls sieht folgendermassen aus:
function CreateDevice( const Adapter : Cardinal; const DeviceType : TD3DDevType; hFocusWindow : HWND; BehaviorFlags : LongWord; var pPresentationParameters : TD3DPresent_Parameters; out ppReturnedDeviceInterface : IDirect3DDevice8 ) : HResult; |
Ja, das ist sozusagen der Hacken an der ganzen Sache. Im Prinzip ist es nur dieser kleine Befehl, doch der hat es in sich. Nachfolgend wird jeder einzelne Parameter erkläärt. Wenn Sie etwas auf Anhieb nicht ganz verstehen sollten, dann seien Sie unbesorgt. Spätestens beim Beispiel, dass weiter unten folgt, wird Ihnen vermutlich wieder alles klar werden.
Adapter: Adapter ist nichts anderes als die Grafikkarte. Die meisten PC's haben nur eine Grafikkarte, die auch zugleich die Standardgrafikkarte ist. Diese können Sie benutzen, in dem Sie einfach den Parameter D3DADPATER_DEFAULT übergeben. Für den Fall, dass sie bei mehreren Grafikkarten, die zur Auswahl stehen, nicht die Standardgrafikkarte benutzen möchten, gibt es Methoden, die wir in einem späteren Kapitel näher erläutern werden.
DeviceType: Mit diesem Parameter können Sie einstellen, ob Ihre Anwendung hardwarebeschleunigt laufen soll, oder nicht. Verwenden Sie hierzu eine Konstante aus D3DDEVTYPE.
hFocusFlags: Hier übergeben Sie Ihrem Device das Handle des Fensters, in dem Ihre Anwendung dargestellt werden soll.
BehaviorFlags: Wie der Name schon andeutet, können Sie mit diesem Parameter noch bestimmte Verhaltenseigenschaften einstellen, insbesondere was die Berechnung der Vertices angeht. Hierbei müssen Sie einen oder mehrere Konstanten, die durch die D3DCREATEFLAGS-Aufzählung definiert sind, verwenden.
pPresentationParameters: Über diesen Parameter wird ein Record übergeben, dass Sie im Vorfeld ausgefüllt haben müssen. Sie stellen damit zum Beispiel die Auflösung im Vollbildmodus ein, und wieviele Backbuffer sie verwenden möchten. Das Record ist vom Typ D3DPRESENT_PARAMETERS.
ppReturnedDeviceInterface: Hier geben Sie die Variable an, die als Direct3DDevice8 zurückgegeben werden soll.
Ich kann mir vorstellen, wie Sie sich jetzt fühlen. Auf der einen Seite haben Sie das Gefühl, etwas dazugelernt zu haben, aber auf der anderen Seite wissen Sie überhaupt nicht, wie Sie das gelernte Wissen anwenden sollen. Ich bin sicher, spätestens nach diesem Beispiel wird Ihnen alles klar sein.
Im nachfolgenden Quellcode werden sowohl Direct3D8 als auch das Direct3DDevice initialisiert:
var d3d8 : IDirect3D8; d3ddev8 : IDirect3DDevice8; procedure TForm1.FormCreate( Sender : TObject ); var d3ddm : TD3DDISPLAYMODE; d3dpp : TD3DPRESENT_PARAMETERS; DeviceTypeFlag : Cardinal; begin // Erstellen von Direct3D8 d3d8 := Direct3DCreate8( D3D_SDK_VERSION ); if ( d3d8 = nil ) then Application.Terminate; // Auslesen der aktuellen Bildschirmeinstellungen (Auflösung, Format, Refreshrate) if ( d3d8.GetAdapterDisplayMode( D3DADAPTER_DEFAULT, d3ddm ) <> D3D_OK ) then Application.Terminate; // Alle Werte des Records d3dpp werden auf 0 bzw Nil gestellt ZeroMemory( @d3dpp, sizeof( d3dpp ) ); // Das zukünftige Device wird über das Record eingestellt d3dpp.Windowed := TRUE; d3dpp.SwapEffect := D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat := d3ddm.Format; d3dpp.EnableAutoDepthStencil := TRUE; d3dpp.AutoDepthStencilFormat := D3DFMT_D16; // Das Device wird erstellt if ( d3d8.CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp, d3ddev8 ) <> D3D_OK ) then Application.Terminate; end; |
Bei dieser Initialisierungsprozedur wird ein Device erstellt, dass im Fenstermodus arbeitet und über einen Tiefenbuffer verfügt. Da im Fenstermodus die aktuelle Bildschirmauflösung übernommen wird, ist es nicht nötig diese nochmal seperat einzustellen. Lediglich das Format muss übergeben werden. Das aktuelle Bildschirmformat erhalten Sie mit der Funktion d3d8.GetAdapterDisplayMode( D3DADAPTER_DEFAULT, d3ddm ). Sie füllt ein Record vom Typ D3DDISPLAYMODE mit den entsprechenden Informationen zu der derzeitigen Bildschirmauflösung.
Würden Sie Ihre Anwendung gerne im Vollbildmodus mit einer Auflösung von 800x600x16 laufen lassen, müssten Sie folgendes schreiben:
d3dpp.Windowed := FALSE; d3dpp.BackBufferWidth := 800; d3dpp.BachBufferHeight := 600; d3dpp.BackBufferFormat := D3DFMT_R5G6B5; |
Auch bei dem Device sollten Sie nicht vergessen, dieses am Ende des Programms freizugeben. Wie beim Direct3D8-Interface geht das über eine kurze If-Abfrage am besten. Beachten Sie, dass Sie das Device vor dem Direct3D8-Interface freigeben müssen.
if d3ddev8 <> nil then d3ddev8 := nil; |
Obwohl Sie bereits jetzt schon viele neue Befehle und Parameter kennengelernt haben, können Sie immer noch nichts konkretes darstellen. Dazu werden Sie in den nun folgenden Kapiteln endlich was erfahren. Zumindest können Sie jetzt schonmal ein eigenes Device einrichten und haben damit schonmal Ihr wichtigstes Werkzeug, um grafisch loslegen zu können.