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?
Odpowiedzi:
OK, więc oto moje rozwiązanie (proszę o komentarz, jeśli można to zrobić lepiej) ...
Okazuje się, że faktycznie powinienem używać testów alfa (odkryłem to przez przypadek, więc nie jestem do końca pewien, dlaczego to działa).
Zwróć uwagę na użycie
GL_ALPHA_TEST
iglAlphaFunc
.źródło
Testy alfa służą do zatrzymania renderowania pikseli renderujących w dowolnym buforze, w tym w buforze Z. Mieszanie alfa to tylko kwestia wizualna - wartości wciąż są zapisywane w zbufferze, co może powodować takie problemy - niewidoczne piksele znajdują się przed kolejnymi renderowanymi pikselami, co oznacza, że nie powiodą się one w teście zt podczas rysowania nowych pikseli. Oto, co możesz zobaczyć na obrazie, który dałeś, ztest nie powiódł się.
Wyłączenie pisania w Z również osiągnie te same cele, ale musisz upewnić się, że narysujesz wszystko z powrotem na pierwsze zamówienie. To powinno być łatwe do zrobienia w grze izometrycznej.
źródło