| Autor |
Beitrag |
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 21.01.04 13:49
Hallo!
In meiner Direct3D-Anwendung würde ich gerne eine Art "Fenster" implementieren:
Ich möchte also z.b. auf einer 100x100 Pixel großen Fläche eine 3D-Szene darstellen, direkt daneben eine andere Szene (vielleicht auch mit anderer Auflösung).
Ich hatte mir das so vorgestellt, daß ich zunächst die Szene auf eine Textur rendere, und anschliessend ein Rechteck mit dieser Textur per orthogonale Sicht-Matrix darstelle.
Die Frage: Wie kriege ich so etwas hin? Das MSDN gibt nicht sehr viel her, ich finde nur Verweise auf das Rendern mit verschiedenen Windows-Handles.
Cu,
Udontknow
Zuletzt bearbeitet von Udontknow am Mi 21.01.04 16:11, insgesamt 1-mal bearbeitet
|
|
MaxiTB
      
Beiträge: 679
Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
|
Verfasst: Mi 21.01.04 13:54
Titel: Boah ...
Sorry ... aber einen schnellen Tip zu dem Problem kann ich dir nicht geben; ich weiß gar nicht, wie man unter Delphi am besten mit DX umgeht und was da schon an 3party support Zeugs gibt.
Aber ich kann dir einen Buchtipp geben; ups, doch nicht, weil es liegt zu Hause.
Nop - im ernst, es gibt eine Menge Möglichkeiten das zu realisieren - nur weiß ich nix auswenig, weil ich seit einem Jahr nix mehr unter DX gecodet habe. Bin ja nicht mehr in der Spielebranche, da verdient man zu schlecht
PS: Ich kann aber zu Hause nachsehen und dir heute Abend was schicken. Ich denke da an ein spezielles Buch, sehr gut, wenn auch in C, aber von einem Studenten und sehr leicht auch für Nicht-C-ler lesbar weil in Standard-C gehalten und nicht C++.
_________________ Euer Mäxchen
Wer früher stirbt, ist länger tot.
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 21.01.04 14:02
Danke für deine Hilfe.
Es geht mir wirklich nur um speziell diese Problematik, ein Buch wäre da eigentlich schon zu viel des guten.
Es geht mir gar nicht um Delphi, mir ist auch C-Code lieb. Ich muss ja nur die entsprechenden Interface-Aufrufe nachbilden.
Cu,
Udontknow
|
|
MaxiTB
      
Beiträge: 679
Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
|
Verfasst: Mi 21.01.04 14:08
Naja ... prinzipiell brauchs ja nur auf eine Surface rendern, also ganz normal. Was ich gerade nicht auswenig weiß, wie man einfach eine surface als Textur laden kann.
Jedenfalls hab ich das Problem so verstanden ... ich bin mir aber noch nicht sicher, wieso eine Textur, wenn du sie eh nur einmal ausgeben willst und nicht nochmals zum Rendern verwendest ... da kannst ja gleich direkt die surface hernehmen ... 
_________________ Euer Mäxchen
Wer früher stirbt, ist länger tot.
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 21.01.04 14:13
Doch, doch, im Endeffekt benutze ich diese Textur zum erneuten Rendern.
Wenn du weisst, wie man auf eine Surface rendert, erleuchte mich bitte, dann werde ich einfach auf die Surface der Textur rendern...
Cu,
Udontknow
|
|
MaxiTB
      
Beiträge: 679
Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
|
Verfasst: Mi 21.01.04 14:18
Titel: Ähm
Jetzt bin ich ein bisserl supplex *g*.
Erstens mal kann man ab DX7 sehr gut statische Objekte in eine Szene einbinden ohne das man den Rechteck/Texturweg nehmen muß - der führt nämlich meistens zu Verzerrungen. Wie das geht, kann ich dir nicht sagen, wir haben damals DX5 als Zielplattform verwendet.
Zweitens bin ich bei der Aussage, wie kann man auf eine surface rendern ein bisserl überrascht. Eigentlich kann man nur auf eine DD-surface rendern; obs jetzt die primary surface ist oder eine beliebige andere gibt man doch beim Erzeugen des DD3D-Interfaces an; oder hab ichs falsch in Erinnerung ? Moment ... ich schau mal nach - jetzt hast mich selber verwirrt. *gg*
_________________ Euer Mäxchen
Wer früher stirbt, ist länger tot.
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 21.01.04 14:31
Äh, gut möglich, ich bin da noch nicht sooo firm drin.
Also, so habe ich das verstanden:
In Direct3D wird nicht direkt gezeichnet, sondern es werden nur Polygone gerendert. Deshalb bin ich hergegangen und habe eben z.B. Bitmaps, die ich zeigen wollte, zunächst als D3DTextur geladen und sie dann auf ein Rechteck, bestehend aus zwei Dreiecken, geklebt, was ich dann gerendert habe.
Verzerrung habe ich nicht, da ich eben zum Rendern eine spezielle Matrix benutze, die sich nicht um die "Tiefe" der Objekte schert.
Ich habe nie irgendein IDirect3DSurface-Interface benötigt. Bis jetzt.
Muss ich da irgendwas mit den Routinen IDirect3DDevice9.CreateRenderTarget respektive IDirect3DDevice9.SetRenderTarget anfangen?
PS: Du schreibst immer DD. Meinst du DirectDraw? Wurde das nicht irgendwie eingestampft? Ich benutze DirectX9.
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Mi 21.01.04 14:54
Hallo.
Folgende procedure hab ich in dem beispiel 'renderToTexture' von Snape gefunden (DX 8.1):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| procedure Render; var backbuffer, zbuffer, texsurf: IDirect3DSurface8; begin SetMatrices;
if (pause) then begin
D3DDev8.GetRenderTarget(backbuffer); D3DDev8.GetDepthStencilSurface(zbuffer); _Texture2.GetSurfaceLevel(0, texsurf);
D3DDev8.SetRenderTarget(texsurf, zbuffer2); D3DDev8.Clear(0, nil, D3DCLEAR_ZBUFFER or D3DCLEAR_TARGET, $FF000000, 1, 0); D3DDev8.BeginScene; D3DDev8.SetStreamSource(0, _VertexBuffer, sizeof(TVertex)); D3DDev8.SetTexture(0, _Texture); D3DDev8.SetVertexShader(D3DFVF_Vertex); D3DDev8.DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); D3DDev8.EndScene;
D3DDev8.SetRenderTarget(backbuffer, zbuffer); D3DDev8.Clear(0, nil, D3DCLEAR_ZBUFFER or D3DCLEAR_TARGET, $FF0000FF, 1, 0); D3DDev8.BeginScene; D3DDev8.SetStreamSource(0, _VertexBuffer2, sizeof(TVertex2D)); D3DDev8.SetTexture(0, _Texture2); D3DDev8.SetVertexShader(D3DFVF_Vertex2D); D3DDev8.DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); D3DDev8.EndScene; end else begin Inc(counter, 1); D3DXMatrixRotationY(matWorld, counter / 1000); D3DDev8.SetTransform(D3DTS_WORLD, matWorld); D3DDev8.Clear(0, nil, D3DCLEAR_ZBUFFER or D3DCLEAR_TARGET, $FF0000FF, 1, 0); D3DDev8.BeginScene; D3DDev8.SetStreamSource(0, _VertexBuffer, sizeof(TVertex)); D3DDev8.SetTexture(0, _Texture); D3DDev8.SetVertexShader(D3DFVF_Vertex); D3DDev8.DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); D3DDev8.EndScene; end;
D3DDev8.Present(NIL, NIL, 0, NIL);
end; |
Vielleicht hilft das weiter, ansonsten kann ich dir auch das ganz ding schicken...is aber noch viel blödsinn mit dabei.
mfg.
maxinni.
_________________ mfg.
mâximôv
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 21.01.04 15:11
Danke, Maximus.
Sieht ein wenig konfus aus. Die Interface-Deklarationen von SetRenderTarget haben sich anscheinend in DX9 geändert.
Das sieht aber sehr verbuggt aus. Schon daß dort keine _Release-Aufrufe von Texsurf sind, stinkt schon gewaltig nach Memory-Leak... Eventuell liegts auch daran, daß vielleicht in Direct3D8 noch keine interne Erhöhung des Referenzzählers beim Aufruf von getsurfacelevel erfolgte...
PS: Habe noch einmal nachgeschaut, es ist definitiv ein Memleak, da nicht TexSurf._Release aufgerufen wird.
Cu,
Udontknow
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Mi 21.01.04 15:31
Wie auch immer...is ja auch kein beispiel refCounting etc.
Was hällst du von der IDirect3DDevice9::SetViewport Methode? Is das nich das was du brauchst?
msdn.microsoft.com/l...evice/p/viewport.asp
_________________ mfg.
mâximôv
|
|
MaxiTB
      
Beiträge: 679
Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
|
Verfasst: Mi 21.01.04 15:50
Titel: ::dontyouknow
DD ... DirectDraw ja. *g*
Sorry, meinte nix IDirect3DSufrace sondern IDirect3D::CreateInterface *g*. Da übergibt man normalerweise die Zielsurface, die man mit DirectDraw erstellt hat. Zuviele surface Gedanken im Hinterkopf, da passiert sowas
Wie gesagt - ich hab noch mit Version 5/6 gebastelt *g*, habe gerade selber mit Entsetzen feststellen müssen, daß da nix mehr beim Alten geblieben ist. Man findet ja nicht mal mehr alten Sample-Code wo noch alles zu Fuß gemacht wird, wie ichs gelernt habe.
Bei statischen Rendern wirds du nicht viel vom Zittern merken. Wenn du aber die Weltkoordinaten änderst und somit das Objekt auch anpaßt koordinatenmäßig, dann kommts zum Zucken - schönstes Anschauungsbeispiel kommt von MS und heißt MidTown Madness - war bei uns damals immer die Paradeausrede, das es andere noch schlechter hinbekommen als wir, die sogar ein MS Siegel drauf haben  .
Scheint so, als müßte ich mal wieder ein neues Buch kaufen, wenn ich Gelegenheit habe - wie kann es MS nur wagen, daß ganze DD/D3D Zeugs nun als D3DX andrehen zu wollen *g*.
_________________ Euer Mäxchen
Wer früher stirbt, ist länger tot.
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 21.01.04 15:58
Ich glaube, du hast mir gut mit dem Code-Snippet geholfen... Der Viewport dagegen legt glaube ich dann nur einen Ausschnitt aus der zu rendernden Szene fest, der gezeigt wird.
Wenn ich also die rechte Hälfte des Schirm als Viewport festlege und dann in der Szenen-Mitte eine Kugel rendere, sehe ich nur die Hälfte der Kugel, die sich noch immer in der Mitte befindet.
Ich brauche aber einen Mechanismus, der mir dann ein Bild liefert, wo diese Szene dementsprechend dann in der rechten Screenhälft abgebildet wird ( also die ganze Kugel bei 3/4 von Screen.Width ein bisschen gestreckt dargestellt).
Cu,
Udontknow
|
|
MaxiTB
      
Beiträge: 679
Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
|
Verfasst: Mi 21.01.04 16:01
Titel: ::dontknow
Schmück mich nicht gerne mit fremden Federn - daher will ich nur dazusagen, der Code ist nicht von mir *g* Falls das letzte post auf mich bezogen war  .
_________________ Euer Mäxchen
Wer früher stirbt, ist länger tot.
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 21.01.04 16:09
Habe es jetzt mal mit dem Viewport probiert. Es klappt genau so, wie ich es wollte, habe also gerade B$/§sinn erzählt.
Danke nochmal an euch beide!
Cu,
Udontknow
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Mi 21.01.04 17:41
ich nehme mal an daas ist ein Teilprob bei Xnebula, oder? wie weit biste denn nun damit?
/me kann die nächste beta kaum noch erwarten 
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 21.01.04 19:34
Hehe, korrekt.
Komme immer weiter, ich denke mal, in den nächsten zwei Wochen habe ich zumindest den Rasseneditor fertig (der ist übrigens dann auch im Client integriert und daher auch in Direct3D zu bewundern...).
Cu,
Udontknow
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Mi 21.01.04 19:36
*freu*
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
MaxiTB
      
Beiträge: 679
Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
|
Verfasst: Mi 21.01.04 19:39
Titel: :shock:
Rasseneditor ?
Ähm - jetzt werde ich aber neugierig ? Darf man eingeweiht werden ?
_________________ Euer Mäxchen
Wer früher stirbt, ist länger tot.
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Mi 21.01.04 19:41
nein
oder doch
man darf www.xnebula.de
is aber im moment nix los dort, da es nur von UdontKnow alias GalaxyLord entwickelt wird und im moment keine beta mehr/schon läuft
ich hab schon an beiden bisherigen betas teilgenommen, die waren schon ohne directX recht net.....
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
|