Ich bin wieder beim Tutorial (lektion 2). Dort soll nun ein Dreieck gezeichnet werden. Bei folgender Prozedur wird aber nur die "Frame-Schrift" blau gefärbt:
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
Ein wenig unorthodox gehst es schon an Zumindest im VCL-Template sollte irgendwo ein "Code hier rein"-Kommentar sein, vermutlich beim OnIdyle-Event. Bei einem Knopfdruck etwas in den Framebuffer von OpenGL zu schieben macht nur sehr sehr selten Sinn. Im allgemeinen wird einfach drauf los gerendert, sofern die Applikation Rechenzeit zur Verfügung stellt. OpenGL-Befehle haben außerhalb eines Aufrufs von OnIdyle meist nichts zu suchen. Der Knopf könnte z.B. rotx inkrementieren, damit dies dann beim eigentlich Rendern von OpenGL berücksichtigt wird. Das Problem sollte also in deinem OnIdyle liege, wo der Code entsprechend einkopiert werden sollte. Vor dem glTranslate sollte zudem unbedingt ein glLoadIdentity aufgerufen werden, damit bei jedem Renderdurchgang definitiv eine bekannte Ausgangssituation besteht.
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Ah, danke. Nach einigem Rumprobieren hab ich endlich herausgefunden, wo der Code hinkommt
Klappt jetzt auch wunderbar...
Mit dem Button hab ich das jedoch nur gemacht, weil ich keinen "Code hier rein"-Kommentar gefunden hab. Und da hab ich es gemacht, wie sonst auch immer, wenn ich Funktionen testen will: Button aufs Form und Code ins OnClick. Scheint wohl bei OGL nicht ratsam zu sein
Registriert: Mi Apr 13, 2005 16:06 Beiträge: 67 Wohnort: Fulda
Wie Phobeus schon gesagt hat, gehört das Zeichnen in die OnIdle-Routine.
Dass sich die fps-Anzeige verfärbt, liegt daran, dass die zuletzt gewählte Farbe (in deinem Beispiel blau) so lange aktiv ist, bis sie wieder geändert wird. Daher wird auch der Text in dieser Farbe gerendert.
Viel wichtiger als dieses Detail ist allerdings, dass der Code zum Zeichnen an der richtigen Stelle steht.
Robert
Edit: Hmm, war wohl zu langsam mit meiner Antwort...
Du kannst ja zum Testen im Button_Click Rendern nur die endgültige Ausgabe auf dem Bildschirm geschieht durch den Befehl SwapBuffers(dc), der am Ende dieser Funktion fehlt.
Registriert: Mi Apr 13, 2005 16:06 Beiträge: 67 Wohnort: Fulda
Malo hat geschrieben:
Und da hab ich es gemacht, wie sonst auch immer, wenn ich Funktionen testen will: Button aufs Form und Code ins OnClick. Scheint wohl bei OGL nicht ratsam zu sein
Dies ist schon deswegen nicht ratsam, weil im allgemeinen der gesamte Bildinhalt vor jedem Neuzeichnen (d.h. für jeden Frame) gelöscht wird. Etwas über einen Button genau einmal zu zeichnen, bewirkt also nicht allzu viel. Das Ergebnis wird wenn überhaupt nur für den Bruchteil einer Sekunde sichtbar sein.
Das OnIdle-Ereignis wird jedoch immer wieder neu aufgerufen. Code, der da drin steht, wird also immer wieder neu gezeichnet und bleibt deswegen sichtbar. Dort wirst du auch das Zeichnen der fps-Anzeige oder z.B. das Löschen des Bildinhalts finden (glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)).
Etwas über einen Button genau einmal zu zeichnen, bewirkt also nicht allzu viel. Das Ergebnis wird wenn überhaupt nur für den Bruchteil einer Sekunde sichtbar sein.
Ne, das bleibt schon im Fenster sichtbar, aber eben nur es nicht von anderen Fenstern vedeckt wird. Dann wird das Paint Ereignis aufgerufen und man muß neuzeichnen. Man kann das ganze also auch nur über das Paint Event (und Resize) machen.
Registriert: Mi Apr 13, 2005 16:06 Beiträge: 67 Wohnort: Fulda
Aber OnIdle wird doch dauernd aufgerufen und damit die Szene dauernd neu gezeichnet.
Wie kann da etwas, was nicht beim OnIdle-Event aufgerufen wird, dennoch sichtbar bleiben?
Und das ganze nur über Paint und Resize zu machen, ginge doch nur für statische Bilder, oder? Denn sobald ich was bewegtes haben will, muss ja öfter als nur dann neu gezeichnet werden, wenn das Formular verdeckt ist oder seine Größe geändert hat.
Ach so meinst du das. Wenn das OnIdle weiterläuft, wird das natürlich überschrieben.
Das mit dem Paint kann man natürlich bei statischen Szenen z.B. in einem Editor benutzen. Da kann man dann ja immer bei Veränderung von Objekten mit der Maus und eben bei OnPaint neuzeichnen und belastet das System ansonsten nicht so sehr. Gerade weil die Darstellung in einem Editor meistens ja nicht so optimiert wie im Spiel ist.
Registriert: Mi Apr 13, 2005 16:06 Beiträge: 67 Wohnort: Fulda
Hmm, der Gedanke ist mir bisher nie gekommen - Neuzeichnen nur dann, wenn sich wirklich was ändert. Obwohl's ja eigentlich sehr logisch ist. Werd ich mir merken!
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja. Der Gedanke ist vorallem im Bezug auf Laptopnutzer sehr Wertvoll. Bei Leuten wie mir saugt OnIdle nämlich RatzFatz den Akku leer.
Robert: Was du vergessen hast ist, dass nur durch das glClear() der Framebuffer geleert wird. Wenn das nicht aufgerufen wird sieht man auch ein einmalig gezeichnetes Bild. (mit den Einschränken die Lars gemacht hat.)
_________________ Blog: kevin-fleischer.de und fbaingermany.com
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.