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

Aktuelle Zeit: Fr Jul 18, 2025 12:31

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Mai 22, 2007 15:51 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Ich verstehe das nicht..

Folgendes: Der Hintergrund meiner GUI ist genau der selbe wie ohne GUI (nur, dass sich die scene nicht mehr ändert). Ich rendere also, die Scene bei Aktivierung der GUI in einer Texture und zeiche die als mein Hintergrund. Klappt perfekt.. auf meinem PC

Sobald ich an einem anderen PC das Programm starte und in die GUI wechseln will, passiert etweder gar nichts (plötzlich schwarze Texture.. GUI geht noch) oder er is auf einmal sehr langsam.. sehr sehr langsam, wie als ob er Schwierigkeiten mit der Texture hätte.

(Was mir auch aufgefallen ist: Die Transparenz klappt auch nur auf meinem PC.. ka woran das liegt..)


Sobald die GUI aktiviert wird, höre ich auf die Scene normal zu rendern, sondern rendere sie damit in meine Textur (bgScreen):

Code:
  1. procedure RenderToTexture;
  2.  //Texturen enablen
  3.  glEnable(GL_TEXTURE_2D);
  4.  
  5.  //Z-Buffer löschen
  6.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  7.  
  8.  
  9.   //Rendern
  10.  MainForm.DrawPlayground;
  11.  
  12. {--- Texture erzeugen ---}
  13.   //Speicher reservieren
  14.   GetMem(pTexData, x*y*3);
  15.  
  16.   // Textur generieren und drauf zeigen
  17.   glGenTextures(1, @bgScreen);
  18.   glBindTexture(GL_TEXTURE_2D, bgScreen);
  19.  
  20.   // Daten in den Speicher, Lineares Filtering aktivieren
  21.   glTexImage2D(GL_TEXTURE_2D, 0, 3, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, pTexData);
  22.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  23.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  24.  
  25.   // Freigeben
  26.   FreeMem(pTexData);
  27.  
  28.  //Daten auf die Texture umleiten
  29.  glBindTexture(GL_TEXTURE_2D, bgScreen);
  30.  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, x, y, 0);
  31.  
  32.  //Z-Buffer löschen
  33.  glClearColor(0,0.0,0.3,0);
  34.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  35.  
  36.  
  37.  //Texturen wieder disablen
  38.  glDisable(GL_TEXTURE_2D);
  39. end;


Ich verändere bewusst die Größe des Viewportes nicht, damit es nicht zu Qualitätsverlusten kommt.. X und Y sind die entsprechenden Größen, die passen..

In meiner GUI habe ich eine Funktion einegbaut, mit der man Hintergrundbilder rendern lassen kann, ich übergebe die Texture also an die GUI und die verwaltet die weiter

Meine GUI render ich so:
Code:
  1. procedure TGUI.Render;
  2. var i, rm: integer;
  3. begin
  4.  glDisable(GL_TEXTURE_2D);
  5.  glMatrixMode(GL_PROJECTION);  // Matrix in den Projectionsmodus setzen
  6.  glLoadIdentity;
  7.  
  8.  glOrtho(0, Width, 0, Height, 0, 1000); //glOrtho setzen
  9.  glMatrixMode(GL_MODELVIEW);   // Matrix in den Modelview setzen
  10.  glLoadIdentity;
  11.  
  12.  //Licht deaktivieren
  13.  glDisable(GL_LIGHTING);
  14.  
  15.  //Wenn erlaubt Hintergrundbild rendern
  16.  if IsBgPicture then begin
  17.   glPushMatrix;
  18.   glTranslatef(0,0,-100);
  19.   glEnable(GL_TEXTURE_2D);
  20.    glBindTexture(GL_TEXTURE_2D, bgPicture);
  21.    glBegin(GL_QUADS);
  22.     glTexCoord2f(0,0); glVertex2f(0,     0);
  23.     glTexCoord2f(0,1); glVertex2f(0,     Height);
  24.     glTexCoord2f(1,1); glVertex2f(Width, Height);
  25.     glTexCoord2f(1,0); glVertex2f(Width, 0);
  26.    glEnd;
  27.   glDisable(GL_TEXTURE_2D);
  28.   glPopMatrix;
  29.  end;
  30.  
  31.  glDepthFunc(GL_ALWAYS);
  32.  
  33.  glEnable(GL_BLEND);
  34.  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  35.  
  36.   //Alle Fenster (-> alle Komponenten) rendern
  37.   glPushMatrix;
  38.   for i:=0 to High(Windows) do
  39.     Windows[i].Render;
  40.   glPopMatrix;
  41.  
  42.  glDisable(GL_BLEND);
  43.  glDepthFunc(GL_LESS);
  44. end;




Die PCs auf dennen ich es getestet habe, sind nicht schlecht (ich hab die Werte nicht im Kopf, aber sie sind besser als meiner hier auf dem ich programmier) daran liegt es also nicht.
Auf allen PCs lief WinXP
Auf allen PCs gehts perfekt, sobald ich das Hintergrundbild deaktiviere (bzw. nicht in die Texture render)..

Ich versteh das nicht, mir ist das völlig schleierhaft und weiterprogrammieren möchte ich auch nicht, da ich eventuel einen logischen Fehler gemacht habe, bei dem ich zu viel umschreiben müsste.
Ich habe mal eine Version des Spiels hochgeladen, damit ihr selber mal schauen könnt, obs bei euch geht oder nicht..
MAEDN-Beta

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 22, 2007 17:02 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Du rufst aktuell glGenTextures(1, @bgScreen); jedem Frame auf wenn das Menü aktiv ist oder?
Und wieso renderst du in eine Textur anstatt in den Hintergrund?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 22, 2007 17:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Also es gibt da einige sachen, die mich stören.
1. Wieso erzeugst du den Texturinhalt zweimal? glCopyTexImage2D erstellt bereits einen Inhalt, du kannst dir das glTexImage2D sparen, solltest allerdings die beiden TexParameteri nach das glCopyTexImage2D setzen. Das erspart dir auch das erstellen des Speicherbereiches von pTexData.
2. Der Grund, weshalb die Textur nicht sauber funktioniert ist höchstwahrscheinlich, dass dein Viewport (also die x und y werte) nicht PowerOfTwo sind. Die getesteten Grafikkarten unterstützen das nicht, oder nur schlecht (Software-Modus). Daher solltest du deine Viewport-Größe auf den nächsten PowerOfTwo Wert hochrechnen, am besten mit folgender Funktion:
Code:
  1.  
  2. function PowerOfTwo(const Input: Integer): Integer;
  3. var
  4.   Value: Integer;
  5. begin
  6.   Value := 1;
  7.   while (value < Input) do
  8.   begin
  9.     Value := Value shl 1;
  10.   end;
  11.   Result := Value;
  12. end;
(habe ich glaube ich irgendwo ausm dglsdk)
Als parameter übergibst du jeweils x und y. Dadurch wird die Textur zwar u.U. ein wenig größer, aber du bist gegen unangenehme überraschungen gewappnet. Wichtig ist dann auch, dass du die Textur nicht mehr mit den Texturcoordinaten 1.0 und 1.0 zeichnen kannst, sondern die Werte entsprechend anhand des POT-Wertes und des normalen errechnest (Normaler geteilt durch POT). Ich würde des weiteren diesen sowie den POT wert zwischenspeichern.

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: Di Mai 22, 2007 18:54 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
i0n0s hat geschrieben:
Du rufst aktuell glGenTextures(1, @bgScreen); jedem Frame auf wenn das Menü aktiv ist oder?
Und wieso renderst du in eine Textur anstatt in den Hintergrund?


Ne, nur einmal wenn ich die GUI aktivier.. Die Procedure RenderToTexture wird nur einmal aufgerufen (bei Start der GUI)
Warum ich nicht in den Hintergrund rendere? Weil sich die Scene nicht ändert während ich in der GUI bin.. Da die Scene rendern bei älteren PCs doch schon dauern kann, blockiert das die GUI ein bischen (es dauert bis sie reagiert, etc) Deswegen render ich in ne Texture und nehm das als Hintergrund..

Zitat:
2. Der Grund, weshalb die Textur nicht sauber funktioniert ist höchstwahrscheinlich, dass dein Viewport (also die x und y werte) nicht PowerOfTwo sind. Die getesteten Grafikkarten unterstützen das nicht, oder nur schlecht (Software-Modus).


Zack, Self-Own :oops:
Ja, stimmt, hab mal einen festen Wert (512 = 2^9) genommen und es ging.. Daran hab ich irgendwie net gedacht..
Verdammte neue Grafikkarte :twisted:


Zitat:
1. Wieso erzeugst du den Texturinhalt zweimal? glCopyTexImage2D erstellt bereits einen Inhalt, du kannst dir das glTexImage2D sparen, solltest allerdings die beiden TexParameteri nach das glCopyTexImage2D setzen. Das erspart dir auch das erstellen des Speicherbereiches von pTexData.

Hm.. Im Renderpass-Tut wird das aber anders erklärt, oder ich habe es falsch verstanden:

Am Anfang Speicher reservieren (ich reservier den Speicher nur, wenn man in die GUI geht.. Wenn man rausgeht, geb ich ihn wieder frei) dann zeichnen..
Ich rendere halt nicht am laufenden Band in die Texture, sondern nur bei Aktivierung der GUI, aber ansonsten sollten die Schritte sich decken..

@Lord Horazont: Danke für die Funktion, ich schau sie mir an.. Schaut aber relativ gut aus, kann ich gebrauchen :)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 23, 2007 15:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Carmageddon hat geschrieben:
Ne, nur einmal wenn ich die GUI aktivier.. Die Procedure RenderToTexture wird nur einmal aufgerufen (bei Start der GUI)
Warum ich nicht in den Hintergrund rendere? Weil sich die Scene nicht ändert während ich in der GUI bin.. Da die Scene rendern bei älteren PCs doch schon dauern kann, blockiert das die GUI ein bischen (es dauert bis sie reagiert, etc) Deswegen render ich in ne Texture und nehm das als Hintergrund..

Stimmt, das hatte ich nicht bedacht, dann ist es auch irrelevant, wie du das mit dem Speicher machst.


Carmageddon hat geschrieben:
Zitat:
1. Wieso erzeugst du den Texturinhalt zweimal? glCopyTexImage2D erstellt bereits einen Inhalt, du kannst dir das glTexImage2D sparen, solltest allerdings die beiden TexParameteri nach das glCopyTexImage2D setzen. Das erspart dir auch das erstellen des Speicherbereiches von pTexData.


Hm.. Im Renderpass-Tut wird das aber anders erklärt, oder ich habe es falsch verstanden:

Am Anfang Speicher reservieren (ich reservier den Speicher nur, wenn man in die GUI geht.. Wenn man rausgeht, geb ich ihn wieder frei) dann zeichnen..
Ich rendere halt nicht am laufenden Band in die Texture, sondern nur bei Aktivierung der GUI, aber ansonsten sollten die Schritte sich decken..

Der Befehl, der schon ein erstelles TexImage braucht, heißt glCopyTexSubImage2D. Dabei muss die textur schon mit glTexImage2D oder glCopyTexImage2D initialisiert worden sein.

Carmageddon hat geschrieben:
@Lord Horazont: Danke für die Funktion, ich schau sie mir an.. Schaut aber relativ gut aus, kann ich gebrauchen :)

Kein Problem, ist zwar nicht von mir, aber egal. :wink:

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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.008s | 15 Queries | GZIP : On ]