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
Community-Fossil
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 26 27 28 29 30 31 32 |
void render(){ mat4 modelview, projection; glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glViewport(viewport[0].x, viewport[0].y, viewport[1].x, viewport[1].y); projection.setIdentity(); projection.ortho(int(viewport[0].x), int(viewport[1].x), int(viewport[0].y), int(viewport[1].y), -1, 1); // Shader shader[0]->bindShader(); shader[0]->sendUniform4x4("projection_matrix", projection.getArray()); shader[0]->sendUniform("texture0", 0); // Karte rendern modelview = tilemap->getModelview(); shader[0]->sendUniform4x4("modelview_matrix", modelview.getArray()); tilemap->renderBuffer(); // Spieler rendern modelview = character->getModelview(); shader[0]->sendUniform4x4("modelview_matrix", modelview.getArray()); character->renderBuffer(); glutSwapBuffers(); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void Tilemap::renderBuffer(){ glBindTexture(GL_TEXTURE_2D, m_texture->getTextureID()); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); glVertexAttribPointer((GLint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer); glVertexAttribPointer((GLint)1, 2, GL_FLOAT, GL_FALSE, 0, 0); glDrawArrays(GL_TRIANGLES, 0, m_vertices.size()/3); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#version 150 uniform mat4 modelview_matrix; uniform mat4 projection_matrix; in vec3 a_Vertex; in vec2 a_TexCoord; out vec2 texCoord0; void main(void){ texCoord0 = a_TexCoord; gl_Position = projection_matrix*modelview_matrix*vec4(a_Vertex, 1.0); gl_Position.z = a_Vertex.z; // depth test } |
Community-Fossil
Zitat
Hast du überhaupt einen Depth Buffer?
Zitat
Ist die glDepthMask() aktiviert?
Zitat
Wann tritt das linke Bild auf?
Zitat
Wieso willst du das mit dem Depth Buffer machen
Zitat
weil du sowieso einfach nach Layer sortiert rendern kannst
Zitat
Wann tritt das linke Bild auf?
Wenn die Figur "hinter" der Karte steht (obwohl sie natürlich davor sein soll).
Zitat
Wieso willst du das mit dem Depth Buffer machen
Damit kann ich die Tilemap sortieren ohne mehrere Buffer benutzen zu müssen oder den Aufwand zu haben im Buffer selbst zu sortieren. Außerdem ist z.B. die Karte nicht transparent.
Zitat
weil du sowieso einfach nach Layer sortiert rendern kannst
Das wird sowieso gemacht, trotzdem wüsste ich gerne warum es nicht geht.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Community-Fossil
Zitat
"Kostenlose" Objektsortierung
Eine 3D-API braucht einen Tiefenpuffer um zu erkennen ob Fragmente verdeckt sind oder nicht und damit Overdraw zu vermeiden. Eine 2D-Anwendung kann diesen Tiefenpuffer aber auch nutzen, nämlich um Objekte zu sortieren. Man nutzt dann die Z-Koordinate der Objekte (= Tiefenkoordinate) quasi als Layer um zu kennzeichnen welches Objekt auf welcher "Höhe" liegt. Wenn man also z. B. einen 2D-Topdown-Shooter entwickelt bei dem der Spieler mit seinem Flugzeug über den Boden fliegt, dann nutzt man den Z-Puffer um die API (die das dann der Hardware überlässt) seine Objekte sortieren zu lassen. Das Flugzeug bekommt dann einen niedrigen Z-Wert (=oben) und Objekte auf dem Boden einen hohen Tiefenwert (=unten/hinten). Die Sortierung übernimmt dann die Grafikkarte und wir müssen uns darum keine Gedanken machen. Würden wir die Anwendung z. B. über die GDI realisieren, müssten wir diese Objekte selbst entsprechend ihrer Höhe sortieren.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Community-Fossil
Community-Fossil
Zitat
Wo vorne und hinten ist hängt von deiner Projektionsmatrix ab und nicht von irgendwelchen Wiki Artikeln...
C-/C++-Quelltext |
|
1 2 |
projection.setIdentity(); projection.ortho(int(viewport[0].x), int(viewport[1].x), int(viewport[0].y), int(viewport[1].y), -1, 1); |
Werbeanzeige