Uwaga: znalazłem już odpowiedź (którą opublikuję po tym pytaniu) - zastanawiałem się tylko, czy zrobiłem to dobrze, czy jest lepszy sposób.
Tworzę izometryczną grę „2.5D” przy użyciu OpenGL ES (JOGL). Przez „2.5D” rozumiem, że świat jest 3D, ale jest renderowany za pomocą płytek izometrycznych 2D.
Pierwotny problem, który musiałem rozwiązać, polegał na tym, że moje tekstury musiały być renderowane w kolejności (od tyłu do przodu), tak aby płytki nakładały się prawidłowo, aby uzyskać odpowiedni efekt. Po lekturze szybko zdałem sobie sprawę, że jest to podejście 2D „starego kapelusza”. Stało się to trudne do wykonania skutecznie, ponieważ gracz może modyfikować świat 3D (aby rzeczy mogły pojawiać się w dowolnym miejscu w przestrzeni 3D) - więc logiczne było, że korzystam z bufora głębokości. Oznaczało to, że nie musiałem się martwić renderowaniem rzeczy we właściwej kolejności.
Jednak napotkałem problem. Jeśli użyjesz GL_DEPTH_TEST
i GL_BLEND
razem, tworzy to efekt, w którym obiekty są mieszane z tłem, zanim zostaną „posortowane” według kolejności Z (co oznacza, że uzyskuje się dziwne nakładanie się tam, gdzie powinna być przezroczystość).
Oto pseudo kod, który powinien zilustrować problem (nawiasem mówiąc, używam libgdx dla Androida).
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
// ...
}
Pytanie brzmi: jak rozwiązać problem nakładania się przezroczystości?