folgendes Problem:
Ich brauche nen Modelleditor, weil ich etwas speziell bin mit meinem Projekt. Da hab ich mir gedacht, dass eine typische grundlage sei einfach mal 3 2D-Viewports und nen 3D-Viewport einzurichten und einfach mal so eben ne Modell struktur zu.. stop! das mit den Viewports ist doch nicht so einfach.
Ich habe mir ein Objekt geschrieben, das Viewports verwaltet. Jedes hat nen eigenen DC und RC. Ich habe gelesen (hier im Forum), dass das so nur geht, wenn ich den RC ständig wechsle, um alle viewports zeichnen zu können, und das enorm rechenlastig wird.
Dazu 2 Fragen:
1. Warum ist das so?
2. Wie macht man es besser?
bei mir gibt es bereits das Problem, dass ich zwar triangles etc. zeichnen kann, aber nur das letzte viewport auch texturen erhält. Find ich doof und wills anders, aber nach dem ich etwa 90% meines Codes, der auf bestimmt 4 Units verteilt ist nochmal durchgekaut habe ist nur ein kleiner Schmerz in meinem Kopf bei rausgekommen.
(Das mit den 4 Units liegt daran, dass ich gleich voll aufs Gas getrampelt bin und sofort Modelle,Texte und Trigonometrie drin haben wollte, dass kann man ja erstmal testweise wech lassen)
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Eine andere Möglichkeit ist, nur ein Fenster(Panel,Form,...) wie bisher zu nehmen und mit glViewport(x,y,width,height) selber die verschiedenen Bereiche für Vorne,Oben,Seite,3D festzulegen. Dann braucht man nur ein DC und ein RC.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
... und selbst wenn Du vier wirklich verschiedene Betriebssystem-Fenster hast und daher vier RCs brauchst, sollten sie sich wenigstens mit wglshareLists EINEN Displaylistenraum teilen: wird man z.B. wirklich in jedem Fenster ganz verschiedene Schriften haben? Ist es wahrscheinlich, pro Fenster ganz verschiedene Texturen zu haben? Bei Deinem Vorhaben ist die Antwort ganz klar NEIN
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Eine kleine Anmerkung zum Wechseln des Kontextes. Ja das ist eine recht kostspielige Anweisung und wenn man darauf verzichten kann dann sollte man das auch tun. Das extrem darfst du aber bitte nicht überbewerten. Der wird dadurch nicht 50% deine Leistung schlucken. Wie viel das genau sein wird hängt vom jeweiligen System ab und je nachdem wie groß das Modell ist wird das wohl auch in den Hintergrund rutschen. Was du auch nicht vergessen darfst ist die typischerweise Arbeitsweise eines 3D Modellers. Denn dieser rendert nicht dauerhaft sondern normal nur dann wenn sich etwas verändert hat. Sei es durch Animationen oder Benutzerinteraktionen. Und das rückt den Mehraufwand, den das Wechseln mit sich bringt, wieder in ein ganz anderes Licht.
Wie der Editor funktionieren soll, die Struktur der Daten-Formate und wie ich sie verwenden will in Spielen/Editoren steht schon 90% fest. Da könnten gegebenfalls nur noch fatale Umstellungen den Plan übern haufn schmeißen. Die Modelle, die ich in dem Editor gestalten will, basieren natürlich auf vetices, die ich zu faces verbinde ( je 3 vertices = 1 face ). Jedes face soll dann mit einem joint gekoppelt werden, der das ganze dann animiert. Und jedes face erhält natürlich eine Textur, deren koordinaten an die Vertices der Fläche weiter gegeeben werden. Darüber will ich hier aber erstmal nicht reden, weil ich ja noch gar nicht soweit bin (ich meld mich mal wieder, weils bestimmt schief geht ^^ ).
Das Prinzip des Editors ist für mich bisher nicht der Knackpunkt. Ich verstehe nur nicht ganz, was der DC und der RC genau machen, und weshalb ich zum Beispiel für mehrere Viewports nur einen brauch. Daher auch das Problem, dass ich mir nicht erklären kann, wie ich es programmtechnisch anstellen soll. Zunächst bin ich nämlich so an die Sache rangegangen, dass ich mir überlegt hatte, dass wenn ich etwas doppelt haben will, dass ich alles verdoppeln muss, was damit zu tun hat, damit es läuft. Das habe ich in diesem Fall erstmal ganz stupide gemacht. Und was man doppelt hat, kann man bequemerweiße in ein Objekt knallen. Beim Rendern ruf ich dann einfach die "draw" prozedur auf, die alles zeichnet und einstellt, was den jeweiligen Viewport betrifft.
Dabei ist mir dann aufgefallen, dass meine Textur-Fonts nur im zuletzt gerenderten Viewport mit Textur angezeigt werden. Also stimmt da etwas nicht. Anschließend bin ich hier ins Forum, weil ich mir gedacht habe, dass es wohl schon mehrere vorher probiert haben und evtl. das Problem kennen... gesucht und nichts in die Richtung gefunden, hingegen war viel interessanter, dass ich gelesen habe, dass mehrere RCs nicht notwendig bis sogar falsch sein würden.
Ich habe in meinem Programm nu 4 Panels und übergebe dem Viewport-Objekt das Panel.handle, damit es daraus den DC erstellen kann und dafür automatisch nen RC bereitstellt. Wie bereits erwähnt sind in meinem Viewport Objekt der RC und DC ein bestandteil, wo durch jeder viewport zwangsläufig nen eigenen RC und DC bekommt. Wie müsste ich es anstellen, damit alle nur einen verwenden?
Danke schön!
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
Ich habe in meinem Programm nu 4 Panels und übergebe dem Viewport-Objekt das Panel.handle, damit es daraus den DC erstellen kann und dafür automatisch nen RC bereitstellt. Wie bereits erwähnt sind in meinem Viewport Objekt der RC und DC ein bestandteil, wo durch jeder viewport zwangsläufig nen eigenen RC und DC bekommt. Wie müsste ich es anstellen, damit alle nur einen verwenden?
Um deine DC/RC Verwirrung etwas zu mindern. Jedes echte Fenster kann DCs besitzen. Dieser DC ist dann an dieses Fenster gebunden. Und sobald man einen RC erstellt hat ist dieser an einen DC gebunden. Um deine Frage da zu beantworten. So lange du auf mehrere echte Fenster rendern willst wirst du niemals nur einen RC haben können. Du müsstest dich dort also auf ein Panel beschränken.
Warum spreche ich von echten Fenstern. Die Komponenten der VCL sind nicht zwangsläufig immer echte Fenster im Windows. Teilweise werden durch die VCL nur Fenster simuliert. Wie zum Beispiel die Labels oder die Paintbox. Echte Fenster kann man erkennen wenn eine Komponente ein Handle (HWND) besitzt. Wobei es das nicht unbedingt immer auch nach Außen reichen muss. Ist aber eigentlich üblich.
hmm okay, schonmal gut zu wissen, dass es gehen soll.. also wenn ich es richtig verstanden habe, dann sollen sich meine 4 Panels jeder ein DC schnappen, die sich wiederrum einen RC teilen. Also ich habe da eine funktion, in der ich den RC erstelle, in dem ich... wadde ich zeg sie euch:
? Sieht für mich irgendwie falsch aus, weil ich dann ja in jedem render; nen RC anfordere, was für meinen rechner ja so viel wie "Overkill" bedeutet.
//Edit: Tags getauscht
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
Nein, es gibt irgendeinen Befehl, womit man den RC wechseln kann. Müsste ich in der Wiki suchen, habe aber leider keine Zeit mehr.
RC immer neu erstellen ist der Tod, vor allem musst du ja dann immer wieder alle Texturen usw. neu laden.
Es gibt ein Template glaubich von Sascha (unter Files soviel ich weiss, oder auch in der dglsdk), wo beschrieben ist, wie man mit 2 Renderkontexten umgehen muss.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Der Befehl heißt "wglMakeCurrent".
Aus dem Windows SDK, Stichwort "Rendering Contexts", dort wird man weitergeleitet zu "Rendering Context Functions"
Five WGL functions manage rendering contexts:
wglCreateContext --------------------- Creates a new rendering context.
wglMakeCurrent ----------------------- Sets a thread's current rendering context.
wglGetCurrentContext --------------- Obtains a handle to a thread's current rendering context.
wglGetCurrentDC ---------------------- Obtains a handle to the device context associated with a thread's current rendering context.
wglDeleteContext ---------------------- Deletes a rendering context.
An application creates a rendering context by calling wglCreateContext. The wglCreateContext function takes a device context handle as its parameter and returns a rendering context handle. The created rendering context is suitable for drawing on the device referenced by the device context handle. In particular, its pixel format is the same as the device context's pixel format.
In diesem Zusammenhang noch erwähnenswert:
wglShareLists ------------------- The wglShareLists function enables multiple OpenGL rendering context to share a single display-list space.
Ich hab mir den Code von Flow mal angesehen und gestaunt, wie schnell man mit wenig Fehlern alles falsch machen kann, weil ich schon so ähnlich ran gegangen bin. Nu läufts natürlich ohne Probleme. Auch dank an Traude für die Erklärung der einzelnen Funktionen, da ist garantiert noch mehr nützliches bei.
Ich habe mich mal rangesetzt und das ganze nochmal in eine (hoffentlich) vernünftige Klasse gesetzt:
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;
procedure TViewport.to_2D_mode;
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(0,self.Width,0,self.Height,0,-128);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;
procedure TViewport.SwapBuffer;
begin
SwapBuffers(self.DC);
end;
function TViewport.get_RC;
begin
Result:=self.RC;
end;
destructor TViewport.Destroy;
begin
DeactivateRenderingContext;
DestroyRenderingContext(self.RC);
ReleaseDC(self.Handle,self.DC);
end;
da steckt alles drin, was man braucht, um ein Viewport zu erstellen. Das einzige was man jetzt noch braucht, ist eine procedure "draw" die halt beinhaltet, was das aktive Viewport darstellen soll.
das könnte im etwa ( in kompletter Anwendung) dann so aussehen:
Code:
procedure TForm1.FormCreate(Sender:TObject);
begin
randomize;//ist immer sinnvoll, zumindest für mich, weil ich viel
//mit "Würfeln" mach
basispfad:=ExtractFilePath(ParamStr(0));//auch immer sinnvoll
//den Basispfad des Progs zu kennen
//hier erstellen wir unser Viewport, dafür brauchen wir nur ein gültiges Handle,
//die Größe des Viewports und ne Hintergrundfarbe
//to_Point3f(); ist übrigens eine Funktion aus meiner TVector.pas
MyViewport.to_3D_mode;//dem Viewport sagen nu kommt 3d
draw_3dkrempel;// eine Procedure starten, die alle 3d-dinge abarbeitet
MyViewport.to_2D_mode;//dem Viewport sagen, ab nu kommt 2d
draw_2dkrempel;// eine Procedure starten, die alle 2d-dinge abarbeitet
MyViewport.SwapBuffer;//am Ende den Buffer swappen ^^
end;
procedure TForm1.FormDestroy(Sender:TObject);
begin
MyViewport.Destroy;// muss beim beenden ausgeführt werden,
//um den DC und RC ordnungsgemäß zu killen und
// das Handle wieder frei zu geben
end;
Habs so gestartet und des macht keine Mucken, wenn man nu mehrere Viewports haben will, macht man sich einfach ne Viewport-Manager, der automatisch wglShareList(); für das gesamte Viewport-array auslöst und schon funzt des.
Wer dazu Verbesserungen hat, der sollte sie dringenst hier loswerden, damit das ganze Rund wird und wirklich Rund läuft. So muss dann nicht für jeden weiteren, der soetwas machen will n riesen Thread aufgemacht werden.
Nochmals großen Dank!
[Edit] -> Zeilenumbrüche korrigiert
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.