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

Aktuelle Zeit: Do Jul 10, 2025 13:02

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: ständig scrollender hintergrund
BeitragVerfasst: Sa Apr 11, 2009 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 30, 2009 14:40
Beiträge: 30
so mal wieder ne kleine frage von mir :roll:

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 ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 11, 2009 20:06 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Für sowas hab ich eine Funktion:
Code:
  1. Function VarWdhF (X : Currency; Min : Currency; Max : Currency) : Currency;
  2. begin
  3.   While X < Min do
  4.     X := X + (Max + 1 - Min);
  5.   While X > Max do
  6.     X := X - (Max + 1 - Min);
  7.   Result := X;
  8. end;


Das ganze würde dann so aussehen:
Code:
  1.  
  2. y := VarWdhF(y - <<HierDenWertEingebenUmWievielDasQuadNachUntenBewegtWerdenSoll>>, <<OberenBildschirmRand>>, <<UnterenBildschirmRand-HöheDesQuads>>);
  3. glBegin
  4.   glTexCoord2f(0,0); glVertex3f(<<LinkesEnde>> , y                 , <<RechtesEnde>>);
  5.   glTexCoord2f(1,0); glVertex3f(<<LinkesEnde>> , y-<<HöheDesQuads>>, <<RechtesEnde>>);
  6.   glTexCoord2f(1,1); glVertex3f(<<RechtesEnde>>, y-<<HöheDesQuads>>, <<LinkesEnde>> );
  7.   glTexCoord2f(0,1); glVertex3f(<<RechtesEnde>>, y                 , <<LinkesEnde>> );
  8. glEnd




Alternativ kannst du auch ein statisches Quad zeichnen und bewegst stattdessen die Textur:
Code:
  1.  
  2. y := VarWdhF(y - <<HierDenWertEingebenUmWievielDasQuadNachUntenBewegtWerdenSoll>>, 0, 1);
  3. glBegin
  4.   glTexCoord2f(0,y  ); glVertex3f(<<LinkesEnde>> , <<ObereBildSchirmKante>> , <<RechtesEnde>>);
  5.   glTexCoord2f(1,y  ); glVertex3f(<<LinkesEnde>> , <<UntereBildSchirmKante>>, <<RechtesEnde>>);
  6.   glTexCoord2f(1,y+1); glVertex3f(<<RechtesEnde>>, <<UntereBildSchirmKante>>, <<LinkesEnde>> );
  7.   glTexCoord2f(0,y+1); glVertex3f(<<RechtesEnde>>, <<ObereBildSchirmKante>> , <<LinkesEnde>> );
  8. glEnd


Ich hoffe das genügt. ;)


Zuletzt geändert von SDH.Prod am Sa Apr 11, 2009 20:49, insgesamt 8-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 11, 2009 20:33 
Offline
DGL Member

Registriert: Sa Aug 09, 2008 09:07
Beiträge: 112
Geht das nicht mit der Texturmatrix einfacher?

Edit: ich les gerade dass du das eh schon geschrieben hast^^
Aber du kannst ja die Textur wiederholen lassen.

http://wiki.delphigl.com/index.php/glTexParameter#Vergleich_zwischen_verschiedenen_Texturwraptypen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 11, 2009 20:39 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Mit der Texturmatrix würde das so aussehen:

Code:
  1.  
  2. y := VarWdhF(y - <<HierDenWertEingebenUmWievielDasQuadNachUntenBewegtWerdenSoll>>, 0, 1);
  3. glMatrixMode(GL_TEXTURE);
  4.   glLoadIdentity;
  5.   glTranslate3f(0,VarWDH(y),0);
  6. glMatrixMode(GL_PROJECTION


Wobei ich davon abraten würde, wenn du vor hast weitere Dinge zu Rendern, dann würdest du sie mit verschieben.

Nebenbei hab ich gemerkt das ich dir die falsche Funktion gegeben habe, mein Beitrag ist jetzt schon bearbeitet. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 11, 2009 21:46 
Offline
DGL Member

Registriert: Sa Aug 09, 2008 09:07
Beiträge: 112
SDH.Prod hat geschrieben:
Wobei ich davon abraten würde, wenn du vor hast weitere Dinge zu Rendern, dann würdest du sie mit verschieben.


Push / Pop


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 11, 2009 21:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 30, 2009 14:40
Beiträge: 30
Zitat:
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 :wink:)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 14, 2009 11:27 
Offline
DGL Member
Benutzeravatar

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 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 Apr 14, 2009 15:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 30, 2009 14:40
Beiträge: 30
ja hab ich (siehe beitrag von "andreas"). inzwischen funktioniert das auch soweit.

hat eigentlich die reihenfolge in der man die texturen lädt irgendeinen einfluss auf diese einstellung ?

ich musste nämlich feststellen, dass sich der hintergrund so nicht wiederholt:
Code:
  1. loadtexture('testbackground.tga',background);
  2. loadtexture('explosions//small_explosion1.tga',small_explosion1);
  3. loadtexture('explosions//small_explosion2.tga',small_explosion2);
  4. loadtexture('explosions//mid_explosion1.tga',mid_explosion1);
  5. loadtexture('explosions//mid_explosion2.tga',mid_explosion2);
  6. loadtexture('explosions//explosion1.tga',explosion1);
  7. loadtexture('explosions//explosion2.tga',explosion2);
  8. loadtexture('explosions//explosion3.tga',explosion3);
  9. gltexparameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  10. gltexparameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);


wenn ich es allerdings so mache wird er korrekt wiederholt:
Code:
  1. loadtexture('explosions//small_explosion1.tga',small_explosion1);
  2. loadtexture('explosions//small_explosion2.tga',small_explosion2);
  3. loadtexture('explosions//mid_explosion1.tga',mid_explosion1);
  4. loadtexture('explosions//mid_explosion2.tga',mid_explosion2);
  5. loadtexture('explosions//explosion1.tga',explosion1);
  6. loadtexture('explosions//explosion2.tga',explosion2);
  7. loadtexture('explosions//explosion3.tga',explosion3);
  8. loadtexture('testbackground.tga',background);
  9. gltexparameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  10. gltexparameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);


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 ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 14, 2009 15:35 
Offline
DGL Member
Benutzeravatar

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 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: So Mai 10, 2009 15:16 
Offline
DGL Member

Registriert: Mo Jun 30, 2008 12:47
Beiträge: 69
Ich habe mal vor geraumer Zeit den Tunnel-effekt nachprogrammiert.
Sourcen sind im Anhang - hoffentlich bringts was / kannst evt. was abschauen.

MfG


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
...GOD is wearing black...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 16:57 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Hast du dir mal die Sources zum 2D-Tutorial reingezogen? Bzw. das tutorial selbst? Da wird ja genau sowas auch behandelt :)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 11, 2009 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 30, 2009 14:40
Beiträge: 30
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.

sieht dann so aus:

Code:
  1.   backgroundz1 := backgroundz1 - 0.0007 * timefactor;
  2.   if backgroundz1 < -1 then backgroundz1 := backgroundz1 + 1;
  3.   backgroundz2 := backgroundz2 - 0.002 * timefactor;
  4.   if backgroundz2 < -1 then backgroundz2 := backgroundz2 + 1;
  5.   backgroundz3 := backgroundz3 - 0.004 * timefactor;
  6.   if backgroundz3 < -1 then backgroundz3 := backgroundz3 + 1;
  7.  
  8.   glpushmatrix;
  9.   glTranslatef(0,backgroundz1,0);
  10.   glbindtexture(GL_TEXTURE_2D,background1);
  11.   glBegin(GL_QUADS);
  12.   glcolor3f(1,1,1);
  13.   gltexcoord2f(0,0); glvertex3f(-20,-5,-30);
  14.   gltexcoord2f(0,1); glvertex3f(-20,-5,10);
  15.   gltexcoord2f(1,1); glvertex3f(20,-5,10);
  16.   gltexcoord2f(1,0); glvertex3f(20,-5,-30);
  17.   glEnd;
  18.   glpopmatrix;  
  19.  
  20.   glEnable(GL_BLEND);
  21.   glBlendFunc(GL_ONE,GL_ONE);
  22.   gldisable(GL_DEPTH_TEST);
  23.  
  24.   glpushmatrix;
  25.   glTranslatef(0,backgroundz2,0);
  26.   glbindtexture(GL_TEXTURE_2D,background2);
  27.   glBegin(GL_QUADS);
  28.   glcolor3f(1,1,1);
  29.   gltexcoord2f(0,0); glvertex3f(-20,-5,-30);
  30.   gltexcoord2f(0,1); glvertex3f(-20,-5,10);
  31.   gltexcoord2f(1,1); glvertex3f(20,-5,10);
  32.   gltexcoord2f(1,0); glvertex3f(20,-5,-30);
  33.   glEnd;
  34.   glpopmatrix;
  35.  
  36.   glpushmatrix;
  37.   glTranslatef(0,backgroundz3,0);
  38.   glbindtexture(GL_TEXTURE_2D,background3);
  39.   glBegin(GL_QUADS);
  40.   glcolor3f(1,1,1);
  41.   gltexcoord2f(0,0); glvertex3f(-20,-5,-30);
  42.   gltexcoord2f(0,1); glvertex3f(-20,-5,10);
  43.   gltexcoord2f(1,1); glvertex3f(20,-5,10);
  44.   gltexcoord2f(1,0); glvertex3f(20,-5,-30);
  45.   glEnd;
  46.   glpopmatrix;
  47.  
  48.   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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 11, 2009 19:16 
Offline
DGL Member
Benutzeravatar

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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 11, 2009 23:34 
Offline
DGL Member
Benutzeravatar

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.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 12, 2009 09:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Was auch helfen kann: Erst den Vordergrund zeichnen, dann den Hintergrund um durch den Depth-Test möglichst viele Fragmente vom Hintergrund auszuschließen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
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.009s | 14 Queries | GZIP : On ]