C
Natürlich kannst du mehrere Texturen auf einmal binden. Ich glaube OpenGL 4 garantiert dir bis zu 80 Texturen die man gleichzeitig benutzen kann. http://www.opengl.org/sdk/docs/man/xhtml/glActiveTexture.xml
;2D schrieb:
aber für z.B. Wände wohl schon nicht mehr, weil die ja bewegliche Objekte verdecken könnten, die dann schon vorher gezeichnet werden müssten.
Hmjo, da geht das nicht so leicht. Trotzdem kannst du eigentlich für alles eine Kameraposition + Objektposition in den Shader schieben (uniform), dann musst du die VBOs gar nicht mehr anfassen. Das ist sicherlich effizienter.
;2D schrieb:
Das einzige Problem ist, dass ich immer wieder die Textur zwischendrin ändern müsste.
Das könnte ein Problem sein. Aber wenn es bei dir eh ein "über" und ein "unter" gibt stellt sich die Frage wie und wo du das speicherst - denn letztlich kannst du da natürlich auch einfach die "tiefe" als Z-Koordinate angeben und den Depth-Puffer alles machen lassen. (Denk dran, wieder also uniform! Also vec3 position statt vec2 position.)
;2D schrieb:
Kurz habe ich mir es schon angeschaut, aber mit fehlt noch irgendwie der Aha-Effekt
Du hast bis jetzt ja auch die VBOs statt Uniforms verändert, da wundert mich das nicht. Also, halten wir mal fest: VBOs für so etwas ändern => Doofe Idee. Man steckt also die Position des Objekts in den Shader (als Uniform) und rechnet die entgültigen Positionen der Vertexe im Shader aus. Wenn du jetzt z.B. 16 Tauben zeichnen willst, heißt das, dass du 16 mal die Position einer Taube im Shader setzen, und dann einen Draw-Call machen musst. Das ist, insbesondere wenn das Tauben-Modell sehr simpel ist, extrem ineffizient. Wenn du jetzt allerdings ein Array im Shader hättest, in das du die Positionen aller 16 Tauben auf einmal schreibst, und dann alles mit eine Draw-Call renderst, wäre das schon wesentlich besser. (Nur so zum Vergleich, das ist natürlich ein Extrem: Damit bin ich bei mir von ~2.5k Würfeln mit 30FPS auf ~25k Würfel mit ~75 FPS gekommen, und ich glaube später ging da sogar noch mehr.)
Wie genau du die Positionsdaten mehrer Objekte auf einmal in den Shader bekommst, ist nicht genau festgelegt. Dafür gibt es mehrere Möglichkeiten, aber ich denke einfach ein 8-32 großes Array dafür zu nehmen und dann halt immer x-viele Objekte auf einmal zu zeichnen sollte für dich schon locker ausreichen.