2012-07-05 12 views
7

Potrzebuję napisać do bufora głębi na urządzeniu z Androidem (OpenGL ES 2.0). Od gl_FragDepth nie można zapisywać w OGL ES 2.0, muszę znaleźć obejście. Właściwie chcę renderować kule przez raycasting, podobnie do tego: http://www.sunsetlakesoftware.com/2011/05/08/enhancing-molecules-using-opengl-es-20. Jednak rozwiązanie objaśnione na tej stronie internetowej (poza renderowaniem renderowania pisanie na głębokość przy użyciu specjalnego glBlendEquation) działa tylko na urządzeniach Apple, a nie na Androidzie, ponieważ GL_MIN_EXT -umieszczenie nie jest obsługiwane.Obejście problemu zapisu bufora głębi/wartości głębokości w OpenGL ES 2.0

Na moim tablecie Tegra3 byłem w stanie wdrożyć tę metodę: Android GLES20.glBlendEquation not working? (btw, polecam użyciu linearyzowanych wartości głębokości, dają lepsze wyniki!) To działa całkiem dobrze, ale oczywiście to jest dostępne tylko na GPU NVIDIA.

W teorii istnieje rozszerzenie GL_EXT_frag_depth (patrz Can an OpenGL ES fragment shader change the depth value of a fragment?), ale nie jest ono również dostępne na urządzeniach z Androidem.

Wreszcie można oczywiście zapisać bufor głębi tylko dla jednej kuli (w przejściu renderowania poza ekranem), a następnie zapisać bufor głębi dla następnej sfery w drugim przejściu renderowania i połączyć te dwa w trzecim przejściu renderowania. W ten sposób będziesz mieć 2 * n + 1 przejścia dla n-kuli - co wydaje się dość nieefektywne!

Ponieważ brakuje mi pomysłów, moje pytanie brzmi: Czy możesz wymyślić inny, ogólny sposób/obejście problemu, aby zapisać bufor głębi na urządzeniu z systemem OpenGL ES 2.0 z systemem Android?

Odpowiedz

2

Cóż, na pewno brakuje tu opcji. Nie znam żadnego dalszego rozwiązania, ponieważ nie znam dobrze Opengl ES.

Jedyną rzeczą, która przychodzi mi do głowy byłoby łączenie wielu przejścia podejście brute-force z pewnym wyprzedzającym:

Sortowanie kulki w grupy, gdzie atomy nie zachodzą na siebie. Powinno być możliwe sortowanie wszystkich sfer z białek w mniej niż dziesięciu grupach. Następnie renderuj wszystkie sfery każdej grupy w jednym przebiegu. Głębokość wierzchołka jest tutaj wystarczająca, ponieważ sfery nie zachodzą na siebie. Następnie możesz "głębiej zmiksować" wyniki.

Wymaga to wstępnego przetwarzania, które może stanowić problem.

+0

To brzmi interesująco! Nie tak eleganckie rozwiązanie, jak bym się spodziewał, ale wydaje się, że nie ma innego ... prawdopodobnie spróbuję. Sortowanie głębokości powinno być wystarczająco szybkie dla większości białek i innych mniejszych cząsteczek. – kroneml