W Direct3D wielozadaniowe moduły cieniujące są proste w użyciu, ponieważ można dosłownie zdefiniować przebiegi w programie. W OpenGL wydaje się to nieco bardziej skomplikowane, ponieważ możliwe jest nadanie programowi cieniującemu tyle cieniowania wierzchołków, geometrii i fragmentów, ile chcesz.
Popularnym przykładem shadera wielopasmowego jest shader toon. Jedno przejście powoduje rzeczywisty efekt cieniowania, a drugie tworzy kontur. Jeśli mam dwa moduły cieniujące wierzchołki, „cel.vert” i „zarys.vert”, oraz dwa moduły cieniujące fragmenty, „cel.frag” i „zarys.frag” (podobnie jak w HLSL), jak mogę to zrobić? połączyć je, aby stworzyć pełny shader toon?
Nie chcę, żebyś powiedział, że można do tego użyć modułu cieniującego geometrię, ponieważ chcę tylko poznać teorię kryjącą się za wielościennymi modułami cieniującymi GLSL;)
Odpowiedzi:
Za wieloprzebiegową nie ma „teorii”. Nie ma „shaderów wielopasmowych”. Multipass jest bardzo prosty: rysujesz obiekt za pomocą jednego programu. Następnie rysujesz obiekt za pomocą innego programu.
Możesz użyć D3DX, takich jak pliki FX, aby ukryć te dodatkowe przejścia. Ale nadal działają w ten sposób. OpenGL po prostu nie ma dla niego kryjówki.
źródło
Renderuj obiekt za pomocą modułu cieniującego komórki, a następnie ponownie renderuj go za pomocą modułu cieniującego kontur.
źródło
W OpenGL 4.0 istnieją jednolite podprogramy . Pozwalają one definiować funkcje, które można wymieniać w czasie wykonywania przy bardzo niewielkim obciążeniu. Możesz więc wykonać 1 funkcję dla każdego przejścia. Również 1 funkcja dla każdego typu modułu cieniującego.
Tutaj jest tutorial .
W starszych wersjach OpenGL najlepiej jest mieć kilka różnych shaderów i zamieniać się nimi. W przeciwnym razie możesz dodać wartości, które pomnożysz przez mundur o wartości 0,0 lub 1,0, aby włączyć lub wyłączyć. W przeciwnym razie warunkowe, jeśli można użyć instrukcji, ale OpenGL wykona wszystkie możliwe wyniki przy każdym wykonaniu / przejściu, więc upewnij się, że nie są zbyt ciężkie.
źródło
Są ludzie, którzy dużo wiedzą o GLSL, więc mam nadzieję, że wyprostowali rekord, ale na podstawie tego, co widziałem, powinieneś być w stanie w swoim shaderze fragmentów zrobić coś takiego (pseudokod, ja pozostawiam rzeczywisty GLSL osobom, które go znają):
Używając
if
s w ten sposób, otrzymujesz coś w rodzaju wielokrotnych przejść. Czy to ma sens?Edycja: Mam nadzieję, że to pytanie w SO pomoże rozwiać pewne nieporozumienia.
źródło