Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 |
int main(int _argc, char** _argv) noexcept { asm volatile("lock cmpxchg8b %eax"); return 0; } // ::main |
Zitat
Ich hab das so gelöst, dass ein Layer aus Quads einem Tileset zugeordnet ist, und damit pro Layer nur einmalig das Tileset, also die Textur gewechselt werden muss.
Momentan habe ich das noch so gelöst, dass der gesamte Layer gerendert wird, also bei einer 256² Tiles großen Map im schlimmsten Fall alle 256²*NumLayers Tiles.Zitat
So müssen ja nur die Bereiche gerendert werden, die auch wirklich zusehn sind.
Momentan habe ich das für QuadLayer so ähnlich wie SFML gelöst, dass ich Vertex-Position, -Farbe, und -Textur-Koordinate gemischt in ein Array verfrachte. Ob ich das irgendwann ändere ist nicht sicher, da es äußerst unwahrscheinlich ist, dass eine Tilemap im laufenden Spiel umgebaut wird. Für solche Fälle gibt es andere Layer-Typen.Zitat
Bleibt immernoch die Frage, wie ich das mit den Texture-Koordianten mache.
C-/C++-Quelltext |
|
1 2 3 4 |
int main(int _argc, char** _argv) noexcept { asm volatile("lock cmpxchg8b %eax"); return 0; } // ::main |
Zitat
Zu 1.: ... das geht? Aber selbst wenn, so wäre das ein ziemlich großer Payload an Meta-Daten und die GraKa müsste dennoch ständig Texturen wechseln, bloß in dem Fall ohne CPU-Kommunikation.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture1ID); glActiveTexture(GL_TEXTURE0 + 1); glBindTexture(GL_TEXTURE_2D, texture2ID); [...] glActiveTexture(GL_TEXTURE0 + 4); glBindTexture(GL_TEXTURE_2D, texture5ID); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
if (texCoord.z == 0) { gl_FragColor = texture(texture0, texCoord.xy); } else if (texCoord.z == 1) { gl_FragColor = texture(texture1, texCoord.xy); } [...] |
Community-Fossil
Community-Fossil
... und warum? Ist es vielleicht ein animiertes Tileset und du schaltest ständig zwischen diesen und jenen Tiles umher? Warum dann nicht einfach pro Animations-Frame einen neuen Textur-Koordinaten-Puffer füllen und jeweils diesen binden?Zitat
Den TextureCoords-Buffer ändere ich halt jede Frame.
C-/C++-Quelltext |
|
1 2 3 4 |
int main(int _argc, char** _argv) noexcept { asm volatile("lock cmpxchg8b %eax"); return 0; } // ::main |
Werbeanzeige