Może być tylko jeden… shader

2010-03-26 20:42

Nie tak znowu dawno temu napisałem notkę na temat kilku typowych nieporozumień, jakie czasami pojawiają w temacie shaderów oraz związanych z nimi (przynajmniej w DirectX) plików .fx. Nie wspomniałem w niej jednak o pewnej kwestii, która jest kluczowa, dla wielu oczywista, a jednocześnie bywa nielichym i do tego niezbyt przyjemnym zaskoczeniem dla kogoś, kto dopiero zaczyna bliższe spotkanie z tematem programowania grafiki 3D.

Scenariusz wyglądać tu może mniej więcej tak. Na początku pracowicie zgłębiamy tajniki posługiwania się graficznym API (dla ustalenia uwagi możemy założyć, że będzie to DirectX :]), w idealnym przypadku zaznajamiając się też dogłębnie ze związaną z tym matematyką. Umiemy obiekty wyświetlać, teksturować, oświetlać, kontrolować ich widoczność, a może nawet i wczytywać skomplikowane modele z plików. Wydaje się, że to wszystko nie jest takie trudne… aż do momentu, gdy doznamy Szoku Typu Pierwszego i dowiemy się, że większość tych wszystkich technik opartych na fixed pipeline jest nam zupełnie niepotrzebna. Żeby bowiem osiągnąć jakiekolwiek sensowne i godne pokazania efekty, w tym chociażby te tak oczywiste jak dynamiczne światła czy cienie, trzeba używać shaderów…
No cóż, mówi się trudno i kodzi się dalej :) Pracowicie eksperymentujemy więc z różnymi efektami graficznymi, pisząc dla nich odpowiednie vertex i pixel shadery, ucząc się przekazywania danych od jednych do drugich, renderowania różnego rodzaju materiałów, korzystania z poszczególnych typów oświetlenia czy efektów postprocessingu i całej masy różnych innych, interesujących rzeczy. Aż w końcu przychodzi taki moment (i to raczej wcześniej niż później), że proste, pojedyncze efekty przestają nam wystarczać – i tutaj właśnie doznajemy Szoku Typu Drugiego.

A wszystko przez pewien prosty fakt. Staje się zresztą on tym bardziej oczywisty, im większą wiedzą na temat działania potoku graficznego dysponujemy. Ale nawet gdy zostaniemy już ekspertami od grafiki 3D, jest on – jak przypuszczam, rzecz jasna :) – wciąż irytujący i trudny do pogodzenia się. Co powoduje tego rodzaju rozterki egzystencjalne?…
To, że naraz można używać co najwyżej jednego shadera danego rodzaju (vertex lub pixel shadera). Tak, shader może być tylko jeden. Jeden, one, ein, un, uno, один, li pa (to ostatnie jest w lojbanie, rzecz jasna ;>). Dlatego właśnie nie istnieje jeden łatwy i szybki, a przede wszystkim ogólny sposób na to, by połączyć ze sobą dwie techniki, z których każda wymaga wykonania kawałka kodu na karcie graficznej dla wierzchołka i/lub piksela.

Nie znaczy to oczywiście, że sprawa jest beznadziejna – dowodem jest choćby to, że przecież gry 3D wciąż jakoś powstają ;) Różne rozwiązania są tu możliwe, jak choćby te opisane kiedyś przez Rega. Wahają się one na skali między złożonością i elastycznością, ale żadne z nich nie jest idealne.

Tags: ,
Author: Xion, posted under Programming »


6 comments for post “Może być tylko jeden… shader”.
  1. Ruslan:
    March 28th, 2010 o 0:11

    Jakby się zastanowić to to jest logiczne, że może w jednym czasie działać tylko jeden shader danego typu (przynajmniej dla mnie to było oczywiste od początku zabawy z shaderami).

    Tak na marginesie: первый znaczy pierwszy, jeden jest один.

  2. Xion:
    March 28th, 2010 o 0:43

    Wydaje mi się, że to nie jest oczywiste, dopóki nie pozna się chociaż z grubsza działania całego potoku, czyli zobaczy obrazek podobny do tego (uwaga, duży).

    “Tak na marginesie: первый znaczy pierwszy, jeden jest один.”
    Doh, wpadka. Już poprawiam :)

  3. Tomasz Dąbrowski:
    March 28th, 2010 o 2:22

    To już nie do końca prawda, OpenGL 3.3 i 4.0 udostępnia subroutines czyli możliwość różnicowania shadera. Czyli coś jak dynamic branching ale z mniejszym ([prawie] zerowym?) narzutem. Nie testowałem jeszcze w praktyce, ale zapowiada się ciekawie. :)

  4. Xion:
    March 28th, 2010 o 10:44

    W DirectX 11 ma być (a właściwie to chyba jest, skoro istnieje już przynajmniej jedna karta go wspierająca) dynamiczne linkowanie shaderów. Co z tego wyjdzie, zobaczymy :)

  5. Kos:
    April 5th, 2010 o 21:05

    Dobrze rozumiem że w lojbanie potrzebujesz 2 słów by powiedzieć ‘jeden’? Znając ten język nie zdziwiłbym się, gdyby sposób zapisu liczb czerpał inspirację np. z liczb Churcha albo czegoś równie sympatycznego. :)

  6. Xion:
    April 5th, 2010 o 23:39

    E, wręcz przeciwnie – system liczb w lojbanie jest jednym z najprostszych, jakie w ogóle da się wymyślić. Liczba to po prostu ciąg cyfr, więc np. 1024 to li panorevo – stąd nietrudno odczytać nazwy poszczególnych cyfr. A czemu li? To po prostu rodzajnik od liczb “zwykłych” (w przeciwieństwie np. do tych porządkowych).

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.