[OpenGL] Fragen zum Texturwechsel
-
Ich habe nun echt viele Tutorials zu OpenGL etc durchgelesen und bin mittlerweile auch ganz firm was so die Möglichkeiten angeht.
Trotzdem fehlt mir noch der Überblick zum großen ganzen. OpenGL Bücher für Spiele sind in DE leider doch selten...
Es geht hier momentan auch nur um 2D. (sorry)
Ich habe im Netz gelesen, dass man am besten jedes Objekt so programmiert, dass es in sich geschlossen arbeitet. Das habe ich soweit auch gemacht. Als Beispiel meine QuadKlasse:void NLQuad::renderObject() { if ( m_blend ) { glEnable(GL_BLEND); glBlendFunc(m_sfactor, m_dfactor); } GLint matrixMode; glGetIntegerv(GL_MATRIX_MODE, &matrixMode); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glTranslatef(this->getPosX(), this->getPosY(), m_zorder); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, &m_texCoords[0]); glVertexPointer(3, GL_FLOAT, 0, &m_vertices[0]); glDrawArrays(GL_QUADS, 0, 4); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glPopMatrix(); glMatrixMode(matrixMode); if ( m_blend ) { glDisable(GL_BLEND); } }
Nur jetzt noch zum Verständnis:
Würdet Ihr das auch so machen? Und wie würdet Ihr das mit den Texturen machen? Da ich mal gelesen habe dass Texturwechsel am meisten Performance kosten, habe ich das so designed, dass man Texturen als Handle bekommt, welche man dann über das Handle binden kann. So kann man als Texturen nur dann wechseln, wenn es nötig ist. Im Fall von 2D kann man also als Bsp. einen großen Atlas laden und jedem Objekt nur die benötigten Koordinaten mitgeben.
Nur da ich blending benutze, müssen die Objekte ja auch nach Z-Buffer sortiert werden. Dies wirft mein Design eigentlich wieder über den Haufen wenn ich zuerst Objekt A mit Textur B rendern muss und dann Objekt B mit Textur C. Da habe ich wieder einen Texturwechsel drin wenn kein Atlas verwendet wird. Durch das aktuelle Design geht das aber nicht automatisch.
Wie wäre das jetzt wenn ich dem Objekt noch einen Texturwechsel einbaue? Dann wäre es aber praktisch so, dass ja nach jedem Objekt wieder eine andere Textur aufgerufen wird. Jeder call to glBindTexture() kostet ja performance. Auch in Richtung Multitexturing laufe ich da ein wenig
Hmm ja ich steck da ein wenig in der Zwickmühle. Hoffe Ihr versteht was ich meine und könnt mir helfen :). Danke euch.
rya.
-
du machst dir soviel gedanken ueber das "kleine", dass du nie zum "grossen" kommst.
Loese keine probleme die du (noch) nicht hast z.b. performance.
Loese das problem was du selbst auflistest "Trotzdem fehlt mir noch der Überblick zum großen ganzen".schreibe moeglich so den code, dass du einzelne teile davon einfach austauschen kannst, dann kannst du spaeter immer noch optimieren.
optimieren sollte man erst nach dem profiling.
profilen sollte man erst wenn man die bedingungen kennt unter denen etwas laufen kann.
simples beispiel: du optimierst jetzt dass nicht die selbe textur doppelt gesetzt wird. du zeichnest mit deiner 2d engine nun 1000 blumen, stiel und blueten in je einer textur, abwechselnd, deine optimierung hat 0 gebracht. vielleicht waere ein texture atlas notwendig, oder vielleicht bist du ganz woanders limitiert?....
wenn du das grosse ganze lernen willst, das ist eigentlich API unabhaengig. da kannst du ruhig alle quellen die du findests durchlesen.