Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 13, 2025 20:27

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Dreieck zeichnen
BeitragVerfasst: Mo Apr 18, 2005 20:03 
Offline
DGL Member

Registriert: Di Nov 16, 2004 17:24
Beiträge: 9
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:

Code:
  1. procedure TGLForm.Button1Click(Sender: TObject);
  2. begin
  3. glTranslatef(-1.5,0,-6);
  4. glBegin(GL_TRIANGLES);
  5.     glColor3f(1,0,0);
  6.     glVertex3f(-1.0,-1.0, 0.0);
  7.     glColor3f(0,1,0);
  8.     glVertex3f( 0.0, 1.0, 0.0);
  9.     glColor3f(0,0,1);
  10.     glVertex3f( 1.0,-1.0, 0.0);
  11. glEnd();
  12. end;


Warum wird kein Dreieck gezeichnet?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 21:01 
Offline
Fels i.d. Brandung
Benutzeravatar

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..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 21:18 
Offline
DGL Member

Registriert: Di Nov 16, 2004 17:24
Beiträge: 9
Ah, danke. Nach einigem Rumprobieren hab ich endlich herausgefunden, wo der Code hinkommt :mrgreen:


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 ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 21:18 
Offline
DGL Member

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...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 21:22 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 21:23 
Offline
DGL Member

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)).

Robert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 21:31 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Zitat:
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 21:42 
Offline
DGL Member

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 21:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 22:02 
Offline
DGL Member

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! ;)

Robert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 22:29 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]