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:
procedure RenderToTexture;
//Texturen enablen
glEnable(GL_TEXTURE_2D);
//Z-Buffer löschen
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
//Rendern
MainForm.DrawPlayground;
{--- Texture erzeugen ---}
//Speicher reservieren
GetMem(pTexData, x*y*3);
// Textur generieren und drauf zeigen
glGenTextures(1,@bgScreen);
glBindTexture(GL_TEXTURE_2D, bgScreen);
// Daten in den Speicher, Lineares Filtering aktivieren
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
//Texturen wieder disablen
glDisable(GL_TEXTURE_2D);
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:
procedure TGUI.Render;
var i, rm:integer;
begin
glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);// Matrix in den Projectionsmodus setzen
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.
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?
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:
function PowerOfTwo(const Input:Integer):Integer;
var
Value:Integer;
begin
Value :=1;
while(value < Input)do
begin
Value := Value shl1;
end;
Result := Value;
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 network • my 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
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 Ja, stimmt, hab mal einen festen Wert (512 = 2^9) genommen und es ging.. Daran hab ich irgendwie net gedacht.. Verdammte neue Grafikkarte
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.
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.
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 network • my 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
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.