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 5 6 |
glBindBuffer(GL_ARRAY_BUFFER, this->VertexBufferId); GLvoid* Data = glMapBufferRange(GL_ARRAY_BUFFER, 0, sizeof(Grafics::VERTEX)*this->VerticesInBuffer,GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); memcpy(Data, this->VertexData, sizeof(Grafics::VERTEX) * this->VerticesInBuffer); glUnmapBuffer(GL_ARRAY_BUFFER); |
Community-Fossil
Community-Fossil
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
std::shared_ptr<Mesh> Mesh::createSprite(const std::string &index, const std::string &vertex, const std::string &texCoord){ std::shared_ptr<Mesh> mesh = std::shared_ptr<Mesh>(new Mesh()); unsigned int indices[] = {0, 1, 2, 0, 2, 3}; bb::vec2 vertices[] = {bb::vec2(), bb::vec2(1, 0), bb::vec2(1, 1), bb::vec2(0, 1)}; bb::vec2 texCoords[] = {bb::vec2(), bb::vec2(1, 0), bb::vec2(1, 1), bb::vec2(0, 1)}; mesh->indexBuffer = std::unique_ptr<bb::VBO<unsigned int>>(new bb::VBO<unsigned int>(index, GL_ELEMENT_ARRAY_BUFFER)); mesh->indexBuffer->fill(indices, 6, sizeof(unsigned int), GL_STATIC_DRAW); mesh->vertex2Buffer = std::unique_ptr<bb::VBO<bb::vec2>>(new bb::VBO<bb::vec2>(vertex, GL_ARRAY_BUFFER)); mesh->vertex2Buffer->fill(vertices, 4, sizeof(bb::vec2), GL_STATIC_DRAW); mesh->texCoordBuffer = std::unique_ptr<bb::VBO<bb::vec2>>(new bb::VBO<bb::vec2>(texCoord, GL_ARRAY_BUFFER)); mesh->texCoordBuffer->fill(texCoords, 4, sizeof(bb::vec2), GL_STATIC_DRAW); return mesh; } |
C-/C++-Quelltext |
|
1 2 |
mesh->vertex2Buffer->bind(); // binden mesh->vertex2Buffer->vertexAttribPointer(shader->getAttribLocation("vertex0"), 2, GL_FLOAT, false, 0, 0); // an den Shader weitereichen |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (20.03.2014, 21:47)
Zitat
z .B. eben eine Texturmatrix, mit der sich die Texturkoordinaten verändern ließen um das Sprite zu animieren.
Community-Fossil
Zitat
Indexbuffer und TexBuffer is klar. Im Vertexbuffer speicherst du die Positions-Koordinaten (x + y)?
Zitat
Und für jedes Quad rufst du dann glDrawElements() auf.
Zitat
Wie muss sowas aussehn?
Ich benutze bei meiner Engine garkeine Matrizen.
Bei mir berechnet der Shader anhand der Kamera-Position die Position auf dem Bildschirm
Zitat
Bist du sicher dass du Shader nutzt? Ich sehe auch im Anfangsbeitrag keinen Hinweis darauf.
Quellcode |
|
1 |
und dann in einer for Schleife alle Objekte rendern. |
Zitat
Du kannst die selbe Geometrie für unterschiedliche Objekte mit den selben Buffern rendern. Eigentlich könnte ich global irgendwo einmal dieses Sprite Mesh generieren und für alle Sprites nutzen (werde ich auch, bin im moment nur woanders dran).
Community-Fossil
Zitat
Das bedeutet aber immernoch, dass für jedes Quad ein glDrawElements() aufgerufen wird, oder?
Ich frage nur nach, weil mir gesagt wurde, dass man immer so wenig Draw-Calls wie möglich nutzen sollte. (Zumindest in DirectX war es so)
Zitat
Was wäre hier Sinnvoller: Die Farbe mit im Vertex (also in dem Quad-Vertexbuffer) speichern, und nur wenn sich die Farbe ändert (was ja nicht soo häufig vorkommen sollte) den Vertexbuffer upzudaten, oder die Farbe (so wie du es glaub ich mit den Texture-Koordinaten machst) bei jeder Frame per Buffer an den Shader zu schicken?
Zitat
Also einfach einen Vertexbuffer mit 4 Vertices erstellen, und dann so wie du das machst für jede Sprite per Matrizen Skalieren, verschieben, etc.?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// [...] spriteMesh->indexBuffer->bind(); spriteMesh->vertex2Buffer->bind(); spriteMesh->vertex2Buffer->vertexAttribPointer(shader->getAttribLocation("vertex0"), 2, GL_FLOAT, false, 0, 0); spriteMesh->texCoordBuffer->bind(); spriteMesh->texCoordBuffer->vertexAttribPointer(shader->getAttribLocation("texCoord0"), 2, GL_FLOAT, false, 0, 0); camera->calculateOrthoMatrix(); for(std::shared_ptr<bb::Entity> entity : entities){ // [...] if(texture && position && object && object->visible){ object->calculateModelMatrix(position); texture->bind(); shader->sendUniform("texture0", 0); shader->sendUniform4x4("pmv", (camera->orthoMatrix*object->modelMatrix).getArray()); glDrawElements(GL_TRIANGLES, spriteMesh->indexBuffer->size(), GL_UNSIGNED_INT, 0); texture->unbind(); } } // [...] } |
C-/C++-Quelltext |
|
1 2 3 4 5 |
shader->bind(); [...] texture->bind(); [...] texture->unbind(); |
Werbeanzeige