PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Direct3D - Nur auf einen Teil des Fensters zeichnen


Gast
2009-06-09, 21:30:18
Hallo,
ich versuche gerade ein kleines Programm zu schreiben, dass mir in einem Teil meines Fensters ein paar Dreiecke zeichnet. Ich programmiere in Delphi, was das ganze natürlich nicht einfacher macht ;) Aber ich hab ein kleines Tutorial gefunden, in dem alles abgedeckt wird, was ich brauche:
http://www.delphi-treff.de/tutorials/grafik-und-spiele/direct3d-mit-delphi-unter-directx-8/
Das einzige was da fehlt, ist wie ich die Initialisierung machen muss, wenn ich nur auf einen Teil meines Fensters zeichnen will.
Ich habe mir gedacht, statt des Handles auf das Fenster übergebe ich ein Handle auf ein Panel (ein Objekt aus der Visual Component Library, auf das man auch zeichnen kann), nur leider meldet "CreateDevice", dass meine Parameter nicht korrekt sind.
Mir ist klar, dass die meisten hier wohl in C++ programmieren, aber vielleicht kann ja einer einen Hinweis geben, was ich falsch mache?

Hier der Code:
// Mit dieser Funktion initialisieren wir D3D
procedure TSample3DForm.D3DInit;
var
hr : HRESULT;
d3dpp : TD3DPRESENTPARAMETERS;
begin
//Erstelle Direct3D! Muß immer als erstes erstellt werden
//Immer D3D_SDK_VERSION als Version setzen
lpd3d:=Direct3DCreate8(D3D_SDK_VERSION);
if(lpd3d=nil) then FatalError(0,'Fehler beim Erstellen von Direct3D!');

// Setze D3DPRESENT_PARAMETERS auf 0, sonst könnten wir probleme mit älteren
// Eintragungen bzw. unkontrollierbaren Ergebnissen bekommen!
// Sollten wir bei allen DirectX Strukturen machen
ZeroMemory(@d3dpp, SizeOf(d3dpp));

with d3dpp do begin
// Hiermit werden alte Frames gelöscht, denn wir brauchen sie nicht
SwapEffect:=D3DSWAPEFFECT_DISCARD;
hDeviceWindow:=Form1.Panel1.Handle; // Handle auf das Panel
BackBufferCount:=1; // 1 Backbuffer

Windowed := TRUE;
BackBufferWidth := 640;
BackBufferHeight := 480;
BackBufferFormat := D3DFind16BitMode;
end;

//Nachdem wir die D3DPRESENT_PARAMETERS Struktur ausgefüllt haben, sind wir
// endlich so weit unser D3D Device zu erstellen
hr:=lpd3d.CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
Form1.Panel1.Handle, //wieder das Handle aufs Window
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
d3dpp,
lpd3ddevice);
if FAILED(hr) then FatalError(hr,'Fehler beim Erzeugen des 3D-Device');
end;