2011-07-22 10 views
5

Jestem nowy dla shaderów i HLSL, robiąc wystarczająco dużo z klasą BasicEffect. Rozumiem, jak działa potok, szczególnie dla shaderów z tylko jednym przejściem. Jednak przy użyciu shaderów 2-pasmowych lub N-passowych nie bardzo rozumiem, w jaki sposób wyniki 2 (lub N) shaderów są łączone.Jak działają shadery wieloprzebiegowe w HLSL?

Czy możesz wyjaśnić, w jaki sposób połączenie ma miejsce? A jeśli to możliwe, przykład, w którym wolisz używać wielodrożnego modułu cieniującego niż wielu shaderów pojedynczego przejścia?

Odpowiedz

5

Shadery wieloprzebiegowe po prostu DODAJ wyniki do poprzednich przejść. Mogą być używane do obsługi wielu świateł, szczególnie gdy model modułu cieniującego GPU nie ma wystarczających instrukcji, aby obsłużyć wymaganą liczbę świateł w jednym przebiegu.

Jeśli naprawdę nie potrzebujesz, nie polecam używania więcej niż jednego przejścia, ponieważ komplikuje takie rzeczy jak mieszanie alfa i mgła. Będziesz musiał inaczej ustawić swoje stany mieszania w pierwszym przejściu do kolejnych przejść.

[Edycja] Jak na komentarz Melchior Blausand użytkownika, jest bardziej prawdą, że wyjście każde przejście jest połączone z aktualną wartością według obecnego blend operation i blend modes, w którym wartość prądu jest wynikiem połączenia wszystkie poprzednie Karnety. W przypadku mieszaczy wieloprzebiegowych często używa się trybu mieszania ADD do łączenia wielu świateł. Należy również pamiętać, że kanał alfa może być połączony z kanałami kolorów za pomocą different blend modes.

+1

Wreszcie! Szukałem tego dokładnego oświadczenia już od wielu godzin. Wielkie dzięki! –

+0

Nie ma za co. Szkoda, że ​​OP nie powrócił, aby oznaczyć go jako odpowiedź;) – Aranda

+1

Ponieważ ADD jest trybem mieszania, uznałbym tę odpowiedź za wprowadzającą w błąd. Wolę stwierdzić, że tryby mieszania można określić dla każdego przebiegu. W szczegółach podano dwóch członków grupy [wyliczenie D3DBLEND] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb172509%28v=vs.85%29.aspx). –

0

Cóż, wszystko zależy od Ciebie, ponieważ musisz wywołać metodę BeginPass przed renderowaniem samej siatki i przejść przez wszystkie przejścia. Daje to możliwość zmiany trybu mieszania i nawet siatka nie musi być taka sama.

Generalnie wynik będzie taki sam, jak w przypadku renderowania (różnych) siatek za pomocą modułu cieniującego z jednym przebiegiem.

+0

"Nawet siatka nie musi być taka sama" czy możesz to wyjaśnić? Chociaż to pierwsze przejście nazywa się funkcjami cieniowania wierzchołków i pikseli, ale później przechodzi tylko nazwane modułem cieniującym pikseli, ponieważ użyło wyjściowego modułu cieniującego ... – Blau

+0

Miałem na myśli, że możesz narysować wszystko pomiędzy BeginPass i EndPass. Używam tego na przykład do komponowania kształtu 2D z różnych cieniowanych części. –