ich würde gerne einen hintergrund machen, der ständig von oben nach unten scrollt. ich habe mir gedacht das geht ganz gut, wenn ich einfach ein quad über den ganzen bildschirm zeichne und darauf eine textur mache, die ich per gltranslatef in der texturenmatrix nach unten bewege. das problem ist jetzt: irgendwann ist die textur ja mal "zu ende". kann man denn nicht irgendwie einstellen, dass der teil der textur, der das quad unten verlässt, sofort wieder oben im quad erscheint? (nennt man das nicht toroid oder so ?)
oder soll ich dafür einfach 2 gleiche quads machen, die dann "abwechselnd" nach unten bewegt werden..? immer wenn das eine grade zu sehen ist, kann das andere wieder hochgesetzt werden...
oder soll ich so einen hintergrund ganz anders umsetzen ?
Wobei ich davon abraten würde, wenn du vor hast weitere Dinge zu Rendern, dann würdest du sie mit verschieben.
ich denke mal hier hilft push/popmatrix oder ? EDIT : ok, da war jemand schneller
jedenfalls danke sehr für die antworten, ich werde mir das mal etwas anschauen dann müsste es schon gehen. (vll werd ich später sowieso auf nen "echten" 3D-hintergrund umsteigen, aber wenn man ein weltraumspiel macht, reicht eine 2D-textur + ein paar sporadische 3d-objekte eigentlich aus )
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Erm... Hast du mal dasda nach dem Erzeugen und Laden der Textur, während sie noch gebunden ist, ausprobiert?
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
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
beides mal rufe ich das beim starten des programms auf.. aber wie gesagt, nur die zweite methode funktioniert.
kann es sein, dass loadtexture (aus der glbitmap) die textur auch gleich noch bindet, und die repeat-sache dann nur auf die aktuell gebundene textur angewendet wird ?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ganz genau das ist es. Die ganzen glTex*-Aufrufe arbeiten ja immer mit der aktuell gebundenen Textur.
Außerdem müsste die glBitmap das auch von haus aus können, oder?
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
hmm also eigentlich geht jetzt alles soweit, das einzige problem was ich noch habe ist, dass der hintergrund so ca 100 fps frisst (~65 fps mit hintergrund, ~165 ohne). kann irgendwie nicht glauben dass das normal ist.
ich mach das jetzt so: ich zeichne 3 große quads über den ganzen bildschirm. alle 3 haben eine sternentextur, die sich mittels GL_REPEAT in der Texturmatrix ständig nach unten bewegt (je mit einer unterschiedlichen geschwindigkeit). das zweite und das dritte quad werden außerdem mittels blending transparent über das erste gelegt, damit man auch alle sieht.
if backgroundz3 < -1 then backgroundz3 := backgroundz3 + 1;
glpushmatrix;
glTranslatef(0,backgroundz1,0);
glbindtexture(GL_TEXTURE_2D,background1);
glBegin(GL_QUADS);
glcolor3f(1,1,1);
gltexcoord2f(0,0); glvertex3f(-20,-5,-30);
gltexcoord2f(0,1); glvertex3f(-20,-5,10);
gltexcoord2f(1,1); glvertex3f(20,-5,10);
gltexcoord2f(1,0); glvertex3f(20,-5,-30);
glEnd;
glpopmatrix;
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE);
gldisable(GL_DEPTH_TEST);
glpushmatrix;
glTranslatef(0,backgroundz2,0);
glbindtexture(GL_TEXTURE_2D,background2);
glBegin(GL_QUADS);
glcolor3f(1,1,1);
gltexcoord2f(0,0); glvertex3f(-20,-5,-30);
gltexcoord2f(0,1); glvertex3f(-20,-5,10);
gltexcoord2f(1,1); glvertex3f(20,-5,10);
gltexcoord2f(1,0); glvertex3f(20,-5,-30);
glEnd;
glpopmatrix;
glpushmatrix;
glTranslatef(0,backgroundz3,0);
glbindtexture(GL_TEXTURE_2D,background3);
glBegin(GL_QUADS);
glcolor3f(1,1,1);
gltexcoord2f(0,0); glvertex3f(-20,-5,-30);
gltexcoord2f(0,1); glvertex3f(-20,-5,10);
gltexcoord2f(1,1); glvertex3f(20,-5,10);
gltexcoord2f(1,0); glvertex3f(20,-5,-30);
glEnd;
glpopmatrix;
glbindtexture(GL_TEXTURE_2D,0);
kann es sein, dass das mein programm 100 fps langsamer macht ? es ist halt immer fast alles von den 3 quads zu sehen und sie füllen wirklich den ganzen bildschirm aus.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Das ist durchaus realistisch, es ist relativ teuer, der Hintergrund nutzt die füllrate maximal aus(alle pixel im Bild werden mindestens 1mal gezeichnet) und je nach Grafikkarte ist die Maximale FPS entsprechende sehr gering.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
rechne doch deine background werte direkt in die glVertex mit hinein, auf dies weiße kannst du dir das gltranslatef und damit auch die ganzen pop/push aufrufe sparen. evtl. sparst du dadurch zeit. Aber an sich sollte es bei solchen Aufrufen keine Probleme mit der geschwindigkeit geben.
Was auch helfen kann: Erst den Vordergrund zeichnen, dann den Hintergrund um durch den Depth-Test möglichst viele Fragmente vom Hintergrund auszuschließen.
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.