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

Aktuelle Zeit: Sa Jul 19, 2025 12:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glClear - Problem
BeitragVerfasst: Di Jul 03, 2007 19:52 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
ich habe folgendes Problem:
Ich rendere eine Spielszene, und am Ende das HUD (Head Up Display). Soweit kein Problem. Aber damit das HUD nicht ganz so langweilig aussieht, hab ich mir gedacht: Lässt du die Spielfigur rotieren. (Es handelt sich um Mensch ärger dich nicht)

Das HUD ist aber im glOrtho Modus, und da dachte ich mir: Renderst du die Spielfigur in eine Texture und pappst sie einfach drauf.
Nur: Ich führe den Renderpass aus, als schon alle anderen Objekte gerendert sind. Und davor rendern geht auch nicht, da das HUD ja praktisch am Bildschirm kleben soll, und nicht hinterm Spielfeld.
Und da taucht jetzt folgendes Problem auf: ich muss glClear aufrufen um den Buffer zu löschen... und zack ist auch alles andere weg.

Und wenn ich die beiden glClear weglasse befindet sich ein Teil der Orginal-Scene im Hintergrund (logisch, weils ja noch da ist).

Mein Renderpass-Code:
Code:
  1. glEnable(GL_TEXTURE_2D);
  2.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //  <----- hier
  3.  glViewport(0, 0, x, y);
  4.  
  5.  //Die Figur rendern
  6.  glPushMatrix;
  7.    Figure.RenderDisplayList;
  8.  glPopMatrix;
  9.  
  10.  glBindTexture(GL_TEXTURE_2D, Screen);
  11.  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, x, y, 0);
  12.  
  13.  glClearColor(0,0.0,0.3,0);
  14.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // <----- und hier
  15.  
  16.  glViewport(0,0,Width,Height);
  17.  
  18.  glDisable(GL_TEXTURE_2D);


Ich weiß nicht wie ich das umgehen soll. Ich habe hier noch ein paar Screens, die mein Problem verdeutlichen:


a) Ohne glClear:
Bild




b) Mit glClear:
Bild

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 03, 2007 20:40 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Eine Möglichkeit ist, vor dem Rendern des HUDs nur den Depth Buffer löschen. Dann braucht man keine zusätzliche Texture und das HUD liegt immer vor dem Spielfeld.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 04, 2007 15:23 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
hm.. ich habe ein bischen rumgespielt, aber es klappt nicht so ganz. Ich muss die Spielfigur leider in die Texture rendern, da ich meine GUI-Engine (nennt man das so) verwende und diese bietet mir nur die Möglichkeit Texturen anzuzeigen, nicht aber ganze Szene zu rendern.

Und den Depth Buffer zu löschen hat auch keine Wirkung.. vorallen nicht bevor ich das HUD rendere..

Mein Aufbau ist wir folgt:
Code:
  1.  DrawPlayground; //Spielfeld mit Figuren, etcpp rendern
  2.  
  3.  [...]
  4.  
  5.  RenderModelForHUD(red,PlayerPic); //Hier z.B. die rote Figur in gluInt PlayerPic rendern
  6.  HUD.Window('hud').Image('playerPic').Image := PlayerPic; //Dem HUD die Texture zuweißen
  7.  HUD.Render; //Das Hud rendern
  8.  
  9.  [...]
  10.  
  11.  SwapBuffer(DC);



Vll verstehe ich dich auch nur falsch kann sein.
Ich formuliere es mal anders: Mein Problem besteht darin, das sich im Hintergrund immer noch das Spielfeld befindet. Kann man nicht irgendwie den Color-Buffer sichern und dann wieder zurückpoppen lassen (so was wie ColorBufferPush / ColorBufferPop ^^ )

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 04, 2007 16:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Ich verstehe nicht warum du dein Männchen nicht vor (zeitlich) ALLEM rendern kannst.
Denn dann könnteste diese Szene in eine Textur rendern und speichern.
Dann glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Dann Spielfeld rendern.
Dann Hud mit erzeugter Textur.

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 04, 2007 17:49 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Klar, des wär die einfachste Möglichkeit, aber ich möchte das alles geordnet an einem Fleck haben (die einzelnen Aufrufe sind über n paar Units verteilt)
Aber wenn es anderes zu aufwendig wird oder es net geht, dann muss ichs wohl so machen..
Ich probier jetzt erst mal noch eh weng

Danke für eure Hilfe

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 04, 2007 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Du kannst in einen andern Buffer rendern, z.B. GL_AUX1.

dazu machst du folgende Aufrufe:
Code:
  1.  
  2.   // Die normale Szene rendern
  3.   glDrawBuffer(GL_AUX1);
  4.   glReadBuffer(GL_AUX1);
  5.   // Rendern der Figur und speichern in Textur
  6.   glDrawBuffer(GL_BACK); // Oder GL_FRONT, falls du kein Doublebuffering aktiviert hast (ist aber standard)
  7.   glReadBuffer(GL_BACK); // Wie oben
  8.   // Deine normale Szene weiterrendern / GUI Rendern oder wasauchimmer
  9.  


Du solltest aber vorher mit GL_AUX_BUFFERS sicherstellen, dass du einen AUX-Buffer hast.

Sonst gäbe es noch die Möglichkeit mit der Framebuffer-Erweiterung, aber das sollte nun wirklich übertrieben sein

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 05, 2007 08:29 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Ja danke, genausowas wie Hilfsbuffer hab ich gesucht, jetzt läufts perfekt.. :)

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.

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