Autor Wątek: GL_POINTS wyświetlane jako kwadraty  (Przeczytany 4717 razy)

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Wrzesień 04, 2016, 12:55:33
Nie wiem czy dobrze zrozumiałem (dwoje szalejących dzieci siedzi mi w tej chwili na głowie). Jeżeli rysujesz kwadrat z warstwami nie wykorzystując mutltiteksturowania tylko po prostu rysując dwa razy ten sam kwadrat na tych samych współrzędnych to bufor głębokości będzie tu płatał figle. Należałoby przy drugim rysowaniu kwadratu wyłączyć odczyt z bufora głębokości albo przy pierwszym rysowaniu wyłączyć zapis do bufora głębokości.

Oczywiście wiąże się to z innymi problemami. Trzeba się zastanowić jak taki zabieg wpłynie na to jak kwadrat będzie rysowany na scenie wśród innych obiektów (zwłaszcza jeżeli są jakieś przed kwadratem). Trzeba to po prostu odopwiednio zorganizować dla danego, konkretnego przypadku.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline slowbro

  • Użytkownik

# Wrzesień 07, 2016, 00:13:58
Jak to jest z kolejnością rysowania elementów sceny przezroczystych i nieprzezroczystych? Rysuje się najpierw nieprzezroczyste od najdalszych od najbliższych (patrząc na scenę od użytkownika), a potem przezroczyste od najdalszych do najbliższych? Czytam na sieci różne fora i różnie tam piszą...

Offline Kos

  • Użytkownik
    • kos.gd

# Wrzesień 07, 2016, 00:38:10
Z tego co wiem:

- Nieprzezroczystych nie musisz sortować, bo masz z-test

- Przezroczyste rysujesz z z-test ale bez z-write. Z-test jest potrzebny żeby były przesłonięte przez nieprzezroczyste, ale z-write byłby błędny, bo nie chcesz by bliższe przezroczyste elementy 'zasłaniały' dalsze. Skoro polegasz na z-test, to wszystkie nieprzezroczyste rzeczy musisz mieć już namalowane w z-buforze.

- Kolejność przezroczystych ma znaczenie. Jeśli masz 3 półprzezroczyste ścianki o kolorach A, B, C i alphie np. 0.5, a za nimi nieprzezroczysty kolor D, to wyjściowy kolor powinien być równy MIX(A, MIX(B, MIX(C, D))).

Przez MIX(P, Q) oczywiście rozumiem P*(alpha) + Q*(1-alpha). W OpenGL-u odpowiada to glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).

Poprawny wynik zatem otrzymujesz rysując po kolei D, C, B, A. Po kolejnych krokach masz w buforze kolor równy:
D
MIX(C, D)
MIX(B, MIX(C, D))
MIX(A, MIX(B, MIX(C, D)))

Jeśli podstawisz wszędzie przykładową alfę 0.5, to wyjdzie Ci że wyjściowy kolor to:

A*0.5 + B*0.25 + C*0.125 + D*0.125

i tu widać czemu kolejność od ostatniego do pierwszego jest ważna - w przeciwnym wypadku warstwy tylne dawałyby zbyt dużo swojego koloru. Ale ale - jeśli masz tylko np. szyby w jednakowym kolorze i z identyczną alphą, to są nieodróżnialne w równaniu, więc możesz sobie darować sortowanie.

Offline slowbro

  • Użytkownik

# Wrzesień 07, 2016, 00:47:11
Dzięki za wyjaśnienie. Co to jest z-write?

Offline Kos

  • Użytkownik
    • kos.gd

# Wrzesień 07, 2016, 08:08:59
Przeciwieństwo z-test :-) Jak dany fragment wyjdzie z pixel shadera (albo czasem wcześniej), to porównujesz sobie jego głębokość z głębokością w z-buforze w tym miejscu. Jeśli fragment jest głębiej niż z-bufor, to odpada.
Natomiast jeśli nie odpadnie, to jego kolor wpisujesz do color buffera, natomiast jego głębokość zostaje zapisana do z-buffera. Prawda? To ostatnie to właśnie z-write i jest opcjonalne.

Offline albireo

  • Użytkownik

  • +2
# Wrzesień 07, 2016, 09:17:58
- Nieprzezroczystych nie musisz sortować, bo masz z-test
Ale jeśli już sortujesz, to lepiej rysować od najbliższego do najdalszego (jeśli pixel odpadnie na wczesnym z-teście, to nie jest odpalany dla niego fragment shader).