2014-11-13 12 views
8

Napisałem mechanizm oparty na kaflach - wszystko wygląda dobrze, dopóki wygładzanie krawędzi jest wyłączone w WebGL.Wyłącz wygładzanie krawędzi w WebGL dla określonej geometrii

Po włączeniu wygładzania krawędzi czasami renderowane są piksele krawędzi płytek, które najczęściej są wyświetlane jako piksele tła i odpowiednio wypełniają bufor głębi. Kiedy pojawia się o wiele bardziej intensywny (wyższa alfa) piksel, zostaje odrzucony z powodu bufora głębi.

Podjęto próbę wyłączenia bufora głębi i "ustawienia współczynników mieszania na GL_SRC_ALPHA_SATURATE (źródło) i GL_ONE (miejsce docelowe)" zgodnie z dokumentacją: http://www.glprogramming.com/red/chapter06.html. To prowadzi do rysowania wyłącznie białych pikseli - nie jestem pewien, co się tam dzieje.

Grafika na moich teksturach jest wyściełana, więc WebGL nie powinien mieć problemów z filtrowaniem. Dopełniłem podszewkę, aby upewnić się, że to nie jest czynnik sprzyjający.

Zbadałem glSampleCoverage() i wypróbowałem kilka ujęć w ciemności z losowymi wartościami, które nie przyniosły nic wartego. Nie mam pojęcia, co tak naprawdę robi i nie mogę znaleźć żadnych dobrych przykładów w Internecie, z wyjątkiem kilku abstrakcyjnych sugestii.

Wolę nie wyłączać bufora głębi.

GL_MULTISAMPLE jest niedostępny.

Mam emscriptena ze środowiskiem C++ - ale to nie ma znaczenia, w razie potrzeby mogę napisać wbudowany javascript - ale sądzę, że istnieje ogólne rozwiązanie OpenGL.

Czy istnieje sposób na wyłączenie wygładzania krawędzi w WebGL tylko dla niektórych geometrii?

Dobre: ​​ Good

Źle: Bad

+0

Prawdopodobnie nie jest to odpowiedź szukasz, ale niedawno napotkasz podobny problem siebie i zastanawiałem się, jeśli dokonały żadnych postępów w rozwiązywaniu go? –

+0

@ WacławJasper Obecnym rozwiązaniem było, niestety, całkowite wyłączenie antyaliasingu. –

Odpowiedz

0

Wszelkie dokumenty można znaleźć na WebGL sugeruje, że obsługuje tylko pełnoekranowego antyaliasingu z wbudowanym w obiektach typu AA.

Głównym problemem w twoim przypadku jest to, że wiele algorytmów AA to "przetwarzanie końcowe", które należy wykonać po wyrenderowaniu całej geometrii. Wiedzą tylko o pikselach.

Możliwe rozwiązanie polega na napisaniu własnego wygładzania, które zamiast informacji geometrii będzie działało, jeśli jest dostępne, lub może działać w kontekście pojedynczego elementu geometrii.

http://www.humus.name/index.php?page=3D&ID=87 http://en.wikipedia.org/wiki/Supersampling

+0

Niestety, nie jest to realistyczna odpowiedź - zwłaszcza gdy bierze się pod uwagę wydajność już utraconą w porcie HTML5 w grze 3D. –

+0

GBAA jest algorytmem tylko GPU. Moją odpowiedzią byłoby przetestowanie tego założenia, które robisz z empirycznymi dowodami, pomimo profilowania. Masz implementację referencyjną DirectX, przełamujesz kofeinę i podkręcasz muzykę. – BlamKiwi