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

Aktuelle Zeit: Fr Jul 18, 2025 11:06

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Dez 31, 2011 21:02 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Kaum zu glauben, er lebt noch...Sketchtower Defense auch, auch wenn ich fast selbst nicht mehr dran glaube, dass es irgendwann nochmal Formen annimmt :D

Egal. Zum Thema...

Mittlerweile hab ich mir VBOs angeeignet, und will sie auch zum Rendern meiner Szenen benutzen (wir erinnern uns: Eigentlich sinds nur ne Menge Quads, alle gleich groß, gleich orientiert, nur unterschiedlich positioniert und texturiert. Einige davon bewegen sich (die Gegner) der Großteil bleibt wo er ist (die Felder des Levels, Türme)). Benutz ich da jetzt....

a) ein VBO mit 4 Vertices drinne, beweg mich mit glTranslate von Ort zu Ort und render das selbe VBO in einem Pass mehrmals

b) ein großes VBO, wo die Vertices aller Quads drin stecken, aktualisier diejenigen, welche sich bewegen vor jedem Pass und rendere dann nur dieses eine VBO einmal

c) eine Mischung aus beiden, weil ich bei den bewegten Vertices besser nen anderen Zugriffsmodus benutze

d) eine Lösung, auf die ich alleine nie gekommen wäre, die ihr mir aber sicher gerne liefert :)


Danke im Vorraus und guten Rutsch, ich geh jetzt erstmal feiern :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 01, 2012 10:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Frohes neues!

ich schlage eine Lösung mit mehreren VBOs und ohne Quads vor:
  • da alle Quads vermutlich quadratisch sind und relativ klein schlage ich vor GL_POINTS zu benutzen. Und die Punktgröße entsprechend auf die Größe des Quads zu setzen. In den VBO musst du so nur den Mittelpunkt schreiben.
  • da alles in einem rutsch gerendert werden muss kannst du nur einige wenige Texturen benutzen. Da die Texturen aber eh klein sind kannst du einfach alle Texturen in eine große Textur packen und die Texcoords entsprechend setzen. Wegen den GL_POINTS wirst du das im Fragmentshader machen müssen, da die automatisch generierten Texcoords (im Fragmentshader: gl_PointCoord) immer von 0 bis 1 gehen. Wenn Shader keine Option sind, benutze Quads.
  • um Pixel-exakt auf eine Textur zu zugreifen benutze die folgende Formel. Dabei ist size die Größe der Textur und pixel geht von 0 bis size-1.
    Code:
    1. (0.5 + pixel) / size
  • der erste VBO enthält alle statischen Objekte, also die die sich nicht verändern. Sollte es größere Teile der Szene geben die nicht immer sichtbar sind, solltest du diesen VBO in mehrere aufteilen. Aber ~500 Dreiecke pro VBO sollten es schon sein. Jedenfalls dann für jeden VBO eine BoundingBox berechnen und vor dem rendern kurz auf Sichtbarkeit prüfen.
  • der zwteite VBO enthält alle dynamischen Objekte und wird jedes Frame neu geschrieben. Hier brauchen nur die sichtbaren Gegner geschrieben zu werden.


Mögliches Problem:
Du hast explizit ausgeschlossen das die Quads rotieren können. Bei einem üblichen Towerdefense können die Gegner und auch die Türme allerdings sehr wohl rotieren. Meist ist es aber auf 8 Richtungen beschränkt. Ich vermute du wolltest da einfach 8 Texturen nehmen?
Wenn du aber doch freies drehen habe willst wäre die Lösung entweder auf die GL_POINTS zu verzichten und die Quads tatsächlich zu drehen oder im Fragmentshader die Texturkoordinaten zu drehen. Letztere Lösung ist bei 4 Richtungen sehr elegant, ansonsten muss die Pointsize größer sein als eigentlich nötig und du hast entsprechenden Overdraw.
Bei 8 Richtungen kannst du auch z.B. zwei vers. Texturen nehmen (0 und 45 Grad) und diese jeweils in die 4 Richtungen drehen.
=> Letztlich bekäme jeder Punkt zwei "Texcoords": die Texturkachel-ID in der großen Tex und die Rotation. Der Fragmentshader würde das mit Hilfe von gl_PointCoord in die richtigen Texturkoordinaten umbasteln.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 01, 2012 13:13 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Selber frohes Neues! :P

Die Idee mit den GL_POINTS erscheint mir ziemlich elegant, und die Shader die dafür zu schreiben sind können ja nicht übermäßig kompliziert sein, oder?
Die Drehung wollte ich eigentlich einfach mit ner Drehung der Textur realisieren. Der Overdraw sollte sich dabei in Grenzen halten, da fast alles, was gedreht werden muss annähernd rund ist. Notfalls hab ich denke ich auch genügend Performance-Reserven, um ein wenig Overdraw unterzubringen - ist ja nicht so, als solle es graphisch extrem anspruchsvoll werden, was ich da schreibe ^^


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 01, 2012 14:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
und die Shader die dafür zu schreiben sind können ja nicht übermäßig kompliziert sein, oder?

Richtig, der sollte relativ simpel sein.

Zitat:
Die Drehung wollte ich eigentlich einfach mit ner Drehung der Textur realisieren.

Dann ist ja alles kein Problem. Ich denke mal du hast sowieso nicht tausende verschiedene Gegner und Türme daher wird der Texturatlas nicht so gigantisch.

Andererseits ist das drehen ja auch recht simpel:
Code:
  1.  
  2. vec2 location = 2.0 * gl_PointCoord - 1.0;
  3. if (dot(location, location) > 1) {
  4.     discard; // Aufpassen das du benachbarte Kacheln nicht erwischt => Kreisform erzwingen
  5. }
  6. float s = sin(angle);
  7. float c = cos(angle);
  8. location = mat2(c,s,c,-s) * location;
  9. vec2 texCoords = ....Texturkoordinaten aus location berechnen...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 06, 2012 22:17 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Hm....wie mach ich das eigentlich mit Menüelementen und so? Die haben ja auch alle jeweils ne Textur (die teilweise erst zur Laufzeit erstellt wird, Schrift und so)...da kann ich ja unmöglich auch ne Riesentextur anlegen und alles via UV-Koordinaten regeln. Also pack ich entweder jedes Element in ein eigenes VBO, oder find ne Möglichkeit, ein VBO mit mehreren versch. Texturen zu rendern (Mehrere Indexbuffer anlegen?!), oder nehm Immediate-Mode....oder fällt euch da auch noch was unsäglich elegantes ein? ^^

Edit: Ich glaub ich hab die Lösung schon selbst gefunden...werd mir wohl Texture-Arrays mal anschauen...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 07, 2012 16:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, wenn du die Schriftzeichen in eine (recht große) Textur vorrenderst, kannst du relativ große Textblöcke in einen Vertex Array / VBO (eventuell eignen sich Vertex Arrays sogar eher als VBOs) packen. Buttonhintergründe etc. würde ich jedenfalls separat vom Text halten (was die OpenGL-Geometrie betrifft).

greetings

_________________
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  
BeitragVerfasst: Sa Jan 07, 2012 17:57 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Warum sollten sich Vertexarrays denn besser eignen als VBOs? Eigentlich sieht mir das ziemlich identisch aus, vom Speicherort mal abgesehen. Wo also sind die Vorteile, die ich nicht sehe?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 07, 2012 18:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, wenn es sich jeden Frame ändert, sind Vertex Arrays unkomplizierter, weil du nicht extra zur Grafikkarte hochladen muss. Und diese muss die Daten nicht speichern, bevor sie gerendert werden.

greetings

_________________
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  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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 | 14 Queries | GZIP : On ]