Hinweis: Ich habe bereits eine Antwort gefunden (die ich nach dieser Frage veröffentlichen werde). Ich habe mich nur gefragt, ob ich es richtig gemacht habe oder ob es einen besseren Weg gibt.
Ich mache ein isometrisches "2.5D" -Spiel mit OpenGL ES (JOGL). Mit "2.5D" meine ich, dass die Welt 3D ist, aber mit isometrischen 2D-Kacheln gerendert wird.
Das ursprüngliche Problem, das ich lösen musste, war, dass meine Texturen in der richtigen Reihenfolge (von hinten nach vorne) gerendert werden mussten, damit sich die Kacheln richtig überlappten, um den richtigen Effekt zu erzielen. Nach einigem Lesen wurde mir schnell klar, dass dies der "alte Hut" 2D-Ansatz ist. Dies wurde schwierig, da die 3D-Welt vom Player geändert werden kann (so dass überall im 3D-Raum Dinge angezeigt werden können) - daher schien es logisch, dass ich den Tiefenpuffer nutze. Dies bedeutete, dass ich mich nicht darum kümmern musste, die Dinge in der richtigen Reihenfolge zu rendern.
Ich hatte jedoch ein Problem. Wenn Sie GL_DEPTH_TEST
und GL_BLEND
zusammen verwenden, wird ein Effekt erzeugt, bei dem Objekte mit dem Hintergrund gemischt werden, bevor sie nach z-Reihenfolge "sortiert" werden (was bedeutet, dass Sie eine seltsame Art von Überlappung erhalten, wo die Transparenz sein sollte).
Hier ist ein Pseudocode, der das Problem veranschaulichen soll (ich verwende übrigens libgdx für Android).
create() {
// ...
// some other code here
// ...
Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
Gdx.gl.glEnable(GL10.GL_BLEND);
}
render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
// ...
// bind texture and create vertices
// ...
}
Die Frage ist also: Wie löse ich das Problem der Transparenzüberlappung?