You are on page 1of 33

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

DirectX. Rendering
w czasie rzeczywistym
Autor: Kelly Dempski
Tumaczenie: Radosaw Meryk (wstp, rozdz. 1 25,
37 40, dod. A), Krzysztof Jurczyk (rozdz. 26 36)
ISBN: 83-7361-120-7
Tytu oryginau: Real-Time Rendering
Tricks and Techniques in DirectX
Format: B5, stron: 688
W cigu kilku ostatnich lat przetwarzanie grafiki w czasie rzeczywistym osigno stopie
najwyszego zaawansowania. Obecnie powszechnie dostpne s procesory przetwarzania
grafiki, ktre dorwnuj szybkoci i moliwociami najdroszym stacjom graficznym
sprzed zaledwie kilku lat.
Jeeli jeste gotw na pogbienie swojej wiedzy na temat programowania grafiki, signij
po t ksik. Opisuje ona zaawansowane zagadnienia w taki sposb, e nawet
pocztkujcy przyswajaj je atwo. Czytelnicy, ktrzy bd studiowa t ksik od
pocztku i dokadnie j przeanalizuj, nie powinni mie problemu z nauczeniem si coraz
bardziej skomplikowanych technik. Czytelnicy zaawansowani mog wykorzystywa t
ksik jako uyteczne rdo informacji, przeskakujc od rozdziau do rozdziau, wtedy
kiedy maj potrzeb nauczenia si lub dokadniejszego poznania wybranych problemw.
Ksika zawiera:

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Powtrzenie wiadomoci o wektorach i macierzach


Omwienie zagadnie zwizanych z owietleniem
Opis potokw graficznych
Opis konfiguracji rodowiska
Sposoby korzystania z DirectX
Dokadne omwienie renderingu
Opis sposobw nakadania tekstur
Problemy zwizane z przezroczystoci
Opis technik vertex shader i pixel shader
Zasady tworzenia cieni przestrzennych
Sposoby tworzenia animowanych postaci
... i wiele innych zaawansowanych technik, uywanych przez profesjonalnych programistw.
Towarzysz jej cenne dodatki na CD (m.in. Microsoft DirectX 8.1 SDK, wersja
demonstracyjna przegldarki efektw NVidia, program do zrzutw video VirtualDub,
wersja demonstracyjna programu trueSpace firmy Caligari)
Niezalenie od Twojego programistycznego dowiadczenia, ksika ta moe posuy Ci
jako przewodnik pozwalajcy na osignicie mistrzostwa w wykorzystaniu moliwoci
programowania grafiki w czasie rzeczywistym.

Spis treci
O Autorze ..............................................................................................15
Od wydawcy serii...................................................................................17
Sowo wstpne ......................................................................................19
Wstp ...................................................................................................21

Cz I

Podstawy ........................................................................... 23

Rozdzia 1. Grafika 3D. Rys historyczny ....................................................................25


Rozwj sprztu klasy PC ..........................................................................................................25
Rozwj konsol do gier ..............................................................................................................26
Rozwj technik filmowych .......................................................................................................27
Krtka historia DirectX.............................................................................................................27
Kilka sw na temat OpenGL....................................................................................................28

Rozdzia 2. Powtrzenie wiadomoci o wektorach ....................................................31


Czym jest wektor?.....................................................................................................................31
Normalizacja wektorw ............................................................................................................32
Arytmetyka wektorw...............................................................................................................33
Iloczyn skalarny wektorw .......................................................................................................34
Iloczyn wektorowy wektorw...................................................................................................35
Kwaterniony..............................................................................................................................37
Dziaania na wektorach w bibliotece D3DX ..............................................................................37
Podsumowanie ..........................................................................................................................39

Rozdzia 3. Powtrzenie wiadomoci o macierzach ....................................................41


Co to jest macierz?....................................................................................................................41
Macierz przeksztacenia tosamociowego ..............................................................................43
Macierz translacji (przesunicia) ..............................................................................................43
Macierz skalowania...................................................................................................................44
Macierz obrotu ..........................................................................................................................44
czenie macierzy.....................................................................................................................45
Macierze a biblioteka D3DX ....................................................................................................46
Podsumowanie ..........................................................................................................................47

Rozdzia 4. Kilka sw o kolorach i owietleniu ........................................................49


Czym jest kolor? .......................................................................................................................49
Owietlenie otaczajce i emisyjne ............................................................................................51
Owietlenie rozpraszajce.........................................................................................................52
Owietlenie zwierciadlane ........................................................................................................53
Pozostae rodzaje wiata ..........................................................................................................54

DirectX. Rendering w czasie rzeczywistym

Uwzgldnianie wszystkich rodzajw owietlenia w Direct3D.................................................55


Rodzaje cieniowania .................................................................................................................57
Podsumowanie ..........................................................................................................................58

Rozdzia 5. Kilka sw o potoku graficznym ..............................................................59


Potok Direct3D .........................................................................................................................60
Wierzchoki oraz powierzchnie wyszego rzdu......................................................................60
Faza staych funkcji transformacji oraz owietlenia .................................................................61
Mechanizmy vertex shader .......................................................................................................62
Mechanizm obcinajcy .............................................................................................................63
Multiteksturowanie ...................................................................................................................63
Mechanizmy pixel shader .........................................................................................................63
Mga ..........................................................................................................................................64
Testy gbi, matrycy oraz kanau alfa .......................................................................................64
Bufor ramek ..............................................................................................................................65
Zagadnienia zwizane z wydajnoci .......................................................................................65
Podsumowanie ..........................................................................................................................66

Cz II

Tworzymy szkielet .............................................................. 69

Rozdzia 6. Konfiguracja rodowiska i prosta aplikacja Win32 ..................................71


Kilka sw o SDK .....................................................................................................................71
Konfiguracja rodowiska ..........................................................................................................72
Prosta aplikacja Win32 .............................................................................................................73
Plik Wykonywalny.h ..........................................................................................................74
Plik Aplikacja.h ..................................................................................................................75
Plik Wykonywalny.cpp.......................................................................................................76
Plik Aplikacja.cpp...............................................................................................................77
Kompilacja i uruchamianie prostej aplikacji ............................................................................79
Analiza. Dlaczego to zrobilimy w taki sposb? ......................................................................80
Podsumowanie ..........................................................................................................................81

Rozdzia 7. Tworzenie i zarzdzanie urzdzeniem Direct3D ........................................83


Czym jest urzdzenie Direct3D?...............................................................................................83
Krok 1: Tworzymy obiekt Direct3D.........................................................................................84
Krok 2: Dowiadujemy si czego wicej na temat sprztu.......................................................85
Krok 3: Utworzenie urzdzenia Direct3D ................................................................................86
Krok 4: Odtworzenie utraconego urzdzenia............................................................................88
Krok 5: Zniszczenie urzdzenia................................................................................................89
Rendering z wykorzystaniem urzdzenia Direct3D..................................................................89
Zerowanie urzdzenia ...............................................................................................................90
Wracamy do pliku Aplikacja.h .................................................................................................91
Wracamy do pliku Aplikacja.cpp..............................................................................................93
Podsumowanie ........................................................................................................................100

Cz III Rozpoczynamy renderowanie............................................. 101


Rozdzia 8. Wszystko rozpoczyna si od wierzchokw............................................103
Czym s wierzchoki? .............................................................................................................103
Czym tak naprawd s wierzchoki?.......................................................................................104
Tworzenie wierzchokw........................................................................................................106
Niszczenie bufora wierzchokw ............................................................................................107
Konfiguracja i modyfikacja danych o wierzchokach.............................................................108
Renderowanie wierzchokw..................................................................................................109

Spis treci

Zagadnienia zwizane z wydajnoci .....................................................................................111


Nareszcie co na ekranie!........................................................................................................112
Podsumowanie ........................................................................................................................117

Rozdzia 9. Zastosowanie transformacji .................................................................119


Co to s transformacje?...........................................................................................................119
Transformacje wiata ..............................................................................................................120
Transformacje widoku ............................................................................................................121
Tworzenie transformacji wiata i transformacji widoku.........................................................121
Rzuty .......................................................................................................................................123
Przeksztacenia a urzdzenie D3D..........................................................................................124
Zastosowanie stosu macierzy..................................................................................................126
Widok ekranu..........................................................................................................................127
czymy to razem...................................................................................................................128
Zalecane wiczenia .................................................................................................................132
Zagadnienia zwizane z wydajnoci .....................................................................................133
Podsumowanie ........................................................................................................................133

Rozdzia 10. Od wierzchokw do figur .....................................................................135


Przeksztacanie wierzchokw w powierzchnie......................................................................135
Renderowanie powierzchni.....................................................................................................136
Renderowanie z wykorzystaniem list trjktw...............................................................137
Renderowanie z wykorzystaniem wachlarzy trjktw ...................................................138
Renderowanie z wykorzystaniem paskw trjktw .......................................................138
Renderowanie z zastosowaniem prymityww indeksowanych........................................139
adowanie i renderowanie plikw .X .....................................................................................141
Problemy wydajnoci..............................................................................................................143
Kod..........................................................................................................................................144
Podsumowanie ........................................................................................................................155

Rozdzia 11. Owietlenie z wykorzystaniem funkcji wbudowanych .............................157


Struktura D3DLIGHT8 ...........................................................................................................157
wiata kierunkowe ..........................................................................................................158
wiata punktowe..............................................................................................................159
wiata reflektorowe.........................................................................................................160
Konfiguracja owietlenia w urzdzeniu D3D .........................................................................162
Program...................................................................................................................................163
Kod..........................................................................................................................................165
Podsumowanie ........................................................................................................................176

Rozdzia 12. Wprowadzenie do tekstur.....................................................................177


Tekstury od rodka..................................................................................................................177
Powierzchnie i pami......................................................................................................178
Rozmiar a potga dwjki ..................................................................................................179
Poziomy powierzchni i mipmapy .....................................................................................179
Tworzenie tekstur....................................................................................................................180
Tekstury i wierzchoki ............................................................................................................183
Tekstury i urzdzenie ..............................................................................................................185
Problemy zwizane z wydajnoci .........................................................................................185
Zagadnienia zaawansowane....................................................................................................186
Tekstury i kolory...............................................................................................................186
Macierz tekstury ...............................................................................................................187
Wielokrotne teksturowanie multiteksturowanie ..........................................................187
Program...................................................................................................................................187
Podsumowanie ........................................................................................................................196

DirectX. Rendering w czasie rzeczywistym

Rozdzia 13. Stany faz tekstur .................................................................................199


Ustawianie stanu fazy tekstury ...............................................................................................200
czenie tekstur i multiteksturowanie ....................................................................................200
D3DTSS_COLOROP i D3DTSS_ALPHAOP.................................................................201
D3DTSS_COLORARG1, D3DTSS_COLORARG2,
D3DTSS_ALPHAARG1 i D3DTSS_ALPHAARG2 ................................................201
Operacje trjargumentowe (D3DTSS_COLORARGO
i D3DTSS_ALPHAARGO) ......................................................................................202
D3DTSS_RESULTARG ..................................................................................................202
Sprawdzanie moliwoci urzdzenia................................................................................202
Odwzorowania nierwnoci (ang. bump mapping) ................................................................203
Stany dotyczce wsprzdnych tekstury ...............................................................................203
D3DTSS_TEXTCOORDINDEX .....................................................................................203
D3DTSS_ADDRESSU, D3DTSS_ADDRESSV i D3DTSS_ADDRESSW ...................203
D3DTSS_BORDERCOLOR............................................................................................205
D3DTS_TEXTURETRANSFORMFLAGS.....................................................................205
Sprawdzanie moliwoci urzdzenia................................................................................205
Filtrowanie tekstury i mipmapy ..............................................................................................205
D3DTSS_MAGFILTER...................................................................................................206
D3DTSS_MINFILTER ....................................................................................................207
D3DTSS_MIPFILTER .....................................................................................................207
D3DTSS_MIPMAPLODBIAS.........................................................................................207
D3DTSS_MAXMIPLEVEL.............................................................................................207
D3DTSS_MAXANISOTROPY .......................................................................................207
Sprawdzanie moliwoci urzdzenia................................................................................208
Stany faz tekstur, a mechanizmy shader .................................................................................208
Kod..........................................................................................................................................208
Podsumowanie ........................................................................................................................215

Rozdzia 14. Testowanie gbi i przezroczysto.......................................................217


Testowanie gbi .....................................................................................................................217
Bufor W ............................................................................................................................219
Przesunicie Z...................................................................................................................219
Zerowanie bufora gbi.....................................................................................................220
Przezroczysto.......................................................................................................................220
Warto alfa w plikach formatu 32-bitowego ..................................................................220
Kana alfa wygenerowany za pomoc programu DirectX Texture Tool..........................221
Kana alfa okrelony za pomoc parametru KluczKoloru................................................221
Wczanie przezroczystoci..............................................................................................222
Test alfa...................................................................................................................................222
Problemy wydajnoci..............................................................................................................223
Kod..........................................................................................................................................223
Podsumowanie ........................................................................................................................231

Cz IV Mechanizmy shader .......................................................... 233


Rozdzia 15. Mechanizmy vertex shader...................................................................235
Co to jest vertex shader? .........................................................................................................236
Rejestry danych o wierzchokach .....................................................................................237
Rejestry staych.................................................................................................................238
Rejestr adresowy...............................................................................................................238
Rejestry tymczasowe ........................................................................................................238
Wynik dziaania mechanizmw vertex shader .................................................................238
Kod mechanizmw shader ......................................................................................................239

Spis treci

Mieszanie i zapisywanie masek ..............................................................................................241


Implementacja shadera............................................................................................................242
Shadery a urzdzenie ........................................................................................................242
Utworzenie deklaracji.......................................................................................................243
Asemblacja shadera ..........................................................................................................245
Utworzenie shadera ..........................................................................................................245
Wykorzystanie shadera.....................................................................................................246
Niszczenie shadera............................................................................................................247
Zastosowanie shaderw do figur tworzonych za pomoc oblicze........................................247
Zastosowanie shaderw do siatek ...........................................................................................247
Prosty shader ...........................................................................................................................248
Przeksztacenia w prostym shaderze ................................................................................248
Ustawianie innych danych opisu wierzchokw...............................................................249
Problemy wydajnoci..............................................................................................................249
Kod..........................................................................................................................................250
Podsumowanie ........................................................................................................................256

Rozdzia 16. Mechanizmy pixel shader.....................................................................259


Co to jest pixel shader? ...........................................................................................................259
Wersje mechanizmw pixel shader.........................................................................................260
Wejcia, wyjcia oraz operacje realizowane przez mechanizmy pixel shader .......................261
Rejestry kolorw...............................................................................................................261
Rejestry tymczasowe i wyjciowe ....................................................................................262
Rejestry staych.................................................................................................................262
Rejestry tekstur .................................................................................................................262
Warunkowe odczytywanie tekstur ..........................................................................................262
Instrukcje dostpne w mechanizmach pixel shader ................................................................263
czenie instrukcji w pary................................................................................................264
Instrukcje adresowania tekstur .........................................................................................264
Modyfikatory dostpne dla mechanizmw pixel shader.........................................................269
Ograniczenia i uwagi dotyczce stosowania mechanizmw pixel shader..............................270
Sprawdzanie dostpnoci mechanizmw pixel shader ...........................................................271
Asemblacja, tworzenie i wykorzystywanie mechanizmw pixel shader..................................271
Bardzo prosta aplikacja wykorzystujca mechanizm pixel shader.........................................272
Proste owietlenie za pomoc mechanizmu vertex shader .....................................................273
Proste operacje czenia wewntrz pixel shadera ...................................................................274
Prosta aplikacja z wykorzystaniem pixel shadera...................................................................276
Podsumowanie ........................................................................................................................280

Cz V

Techniki wykorzystujce mechanizmy vertex shader .......... 283

Rozdzia 17. Zastosowanie shaderw z modelami w postaci siatek ...........................285


Pojcia podstawowe................................................................................................................285
Od materiaw do kolorw wierzchokw..............................................................................287
Od kolorw wierzchokw do danych opisu wierzchokw...................................................288
Problemy wydajnoci..............................................................................................................289
Implementacja.........................................................................................................................289
Podsumowanie ........................................................................................................................295

Rozdzia 18. Proste i zoone przeksztacenia geometryczne


z wykorzystaniem mechanizmw vertex shader.....................................297
Przemieszczanie wierzchokw wzdu wektorw normalnych.............................................297
Znieksztacanie wierzchokw z wykorzystaniem sinusoidy .................................................300
Implementacja.........................................................................................................................304
Pomysy na rozszerzenie przykadowego programu...............................................................308
Podsumowanie ........................................................................................................................309

10

DirectX. Rendering w czasie rzeczywistym

Rozdzia 19. Billboardy i mechanizmy vertex shader .................................................311


Podstawowe zagadnienia dotyczce billboardw ...................................................................312
Mechanizm shader dla billboardu ...........................................................................................312
Implementacja.........................................................................................................................316
Inne przykady billboardw ....................................................................................................321
Podsumowanie ........................................................................................................................322

Rozdzia 20. Operacje w innych ukadach wsprzdnych ni ukad kartezjaski ........325


Ukad kartezjaski oraz inne ukady wsprzdnych..............................................................325
Odwzorowania pomidzy ukadami wsprzdnych w mechanizmie vertex shader..............327
Kod programu .........................................................................................................................330
Inne zastosowania pokazanej techniki ....................................................................................336
Podsumowanie ........................................................................................................................337

Rozdzia 21. Krzywe Beziera ....................................................................................339


Linie, krzywe, obszary ............................................................................................................339
Obliczanie wektorw normalnych za pomoc rniczek....................................................342
Obliczanie wartoci dla obszaru za pomoc shadera ..............................................................345
Aplikacja wykorzystujca obszary Beziera................................................................................348
Zastosowania i zalety obszarw Beziera ................................................................................356
czenie krzywych i obszarw ...............................................................................................357
Podsumowanie ........................................................................................................................358

Rozdzia 22. Animacja postaci skinning z wykorzystaniem palety macierzy ............359


Techniki animacji postaci .......................................................................................................359
Rejestr adresowy .....................................................................................................................362
Skinning z wykorzystaniem palety macierzy wewntrz shadera............................................363
Aplikacja .................................................................................................................................365
Inne zastosowania palet ..........................................................................................................374
Podsumowanie ........................................................................................................................374

Rozdzia 23. Proste operacje z kolorami...................................................................377


Kodowanie gbi za pomoc koloru wierzchoka ...................................................................377
Shader gbi.............................................................................................................................378
Aplikacja wykorzystujca kodowanie gbi .............................................................................380
Shader implementujcy efekt promieni X ..............................................................................381
Aplikacja wykorzystujca efekt promieni X ..............................................................................384
Podsumowanie ........................................................................................................................387

Rozdzia 24. Wasne owietlenie z wykorzystaniem vertex shadera ...........................389


Przeksztacanie wektorw owietlenia do przestrzeni obiektu ...............................................390
Shader owietlenia kierunkowego ..........................................................................................393
Shader owietlenia punktowego..............................................................................................395
Shader owietlenia reflektorowego.........................................................................................397
Kod aplikacji ...........................................................................................................................399
Wiele rodzajw owietlenia w jednym shaderze ....................................................................401
Podsumowanie ........................................................................................................................402

Rozdzia 25. Cieniowanie kreskwkowe ...................................................................403


Shadery, tekstury i funkcje zespolone.....................................................................................403
Shader kreskwkowy cz 1 ............................................................................................405
Shader kreskwkowy cz 2 ............................................................................................406
Implementacja cieniowania kreskwkowego w shaderze ......................................................408
Aplikacja cieniowania kreskwkowego..................................................................................409
Modyfikacja tekstur ................................................................................................................410
Modyfikacja shadera ...............................................................................................................411
Podsumowanie ........................................................................................................................411

Spis treci

11

Rozdzia 26. Odbicie i zaamanie wiata..................................................................413


Mapowanie rodowiskowe i mapy szecienne........................................................................413
Dynamiczna modyfikacja map szeciennych .........................................................................414
Obliczanie wektorw odbi ....................................................................................................415
Obliczanie przyblionych wektorw zaamania wiata.........................................................417
Efekty odbicia i zaamania z wykorzystaniem vertex shadera ...............................................419
Aplikacja .................................................................................................................................421
Inne przykady wykorzystania map szeciennych ..................................................................427
Podsumowanie ........................................................................................................................427

Rozdzia 27. Cienie cz 1. Cienie na paszczyznach ..........................................429


Rzutowanie cieni na paszczyzn............................................................................................429
Rwnanie paszczyzny............................................................................................................430
Macierz cienia .........................................................................................................................432
Wykorzystanie bufora matrycy w tworzeniu cieni .................................................................433
Aplikacja demonstracyjna.......................................................................................................434
Ograniczenia techniki cieniowania na paszczyzn ................................................................442
Podsumowanie ........................................................................................................................443

Rozdzia 28. Cienie cz 2. Cieniowanie przestrzenne ........................................445


Zasada tworzenia cieni przestrzennych...................................................................................445
Wykorzystanie mechanizmu vertex shader w tworzeniu cienia przestrzennego....................451
Kod aplikacji wykorzystujcej cieniowanie przestrzenne ......................................................452
Zalety i wady cieniowania przestrzennego.................................................................................459
Podsumowanie ........................................................................................................................460

Rozdzia 29. Cienie cz 3. Mapy cieni ..............................................................463


Podstawy mapy cieni ..............................................................................................................463
Renderowanie do tekstury sceny z punktu widzenia kamery .................................................466
Renderowanie do tekstury.......................................................................................................467
Mechanizm cieniowania wierzchokw porwnujcy wartoci gbi ....................................469
Pixel shader wykonujcy mapowanie cieni..............................................................................470
Aplikacja .................................................................................................................................471
Wady i zalety techniki mapowania cieni ................................................................................479
Podsumowanie ........................................................................................................................479

Cz VI Techniki wykorzystujce pixel shader................................ 481


Rozdzia 30. Owietlenie reflektorowe per pixel .......................................................483
Proste mapy wietlne ..............................................................................................................483
Owietlenie per pixel z wykorzystaniem pixel shadera ..........................................................485
Owietlenie reflektorowe per pixel .........................................................................................486
Vertex shader stosowany w technice owietlenia reflektorowego per pixel ..........................489
Pixel shader stosowany w technice owietlenia reflektorowego per pixel .............................491
Aplikacja owietlenia reflektorowego per pixel .....................................................................491
Owietlenie punktowe per pixel..............................................................................................494
Vertex shader stosowany w technice owietlenia punktowego per pixel ...............................495
Pixel shader stosowany w technice owietlenia punktowego per pixel..................................496
Aplikacja owietlenia punktowego per pixel ..........................................................................497
Ograniczenia prezentowanych technik ...................................................................................498
Podsumowanie ........................................................................................................................499

Rozdzia 31. Owietlenie per pixel odwzorowanie nierwnoci................................501


Pojcie odwzorowania nierwnoci........................................................................................501
Tworzenie map wektorw normalnych i korzystanie z nich ..................................................503
Tworzenie wektorw bazowych w przestrzeni tekstury .........................................................505

12

DirectX. Rendering w czasie rzeczywistym

Vertex shader odwzorowania nierwnoci.................................................................................507


Odwzorowanie nierwnoci bez pixel shadera.......................................................................508
Odwzorowanie nierwnoci z wykorzystaniem pixel shadera ...............................................513
Ograniczenia oraz moliwoci usprawnienia techniki odwzorowania nierwnoci...............515
Podsumowanie ........................................................................................................................516

Rozdzia 32. Implementacja technik per vertex jako techniki per pixel......................519
Odbicie per pixel.....................................................................................................................519
Korzystanie z texm3x3pad......................................................................................................520
Vertex shader odwzorowania nierwnoci z odbiciem wiata ..............................................522
Pixel shader odwzorowania nierwnoci z odbiciem wiata.................................................524
Aplikacja odwzorowania nierwnoci z odbiciem wiata .....................................................525
Cieniowanie kreskwkowe per pixel ......................................................................................530
Vertex shader cieniowania kreskwkowego per pixel............................................................530
Pixel shader cieniowania kreskwkowego per pixel ..............................................................532
Aplikacja cieniowania kreskwkowego per pixel ..................................................................534
Podsumowanie ........................................................................................................................536

Cz VII Inne techniki .................................................................... 539


Rozdzia 33. Renderowanie do tekstury penoekranowe rozmycie ruchu ................541
Tworzenie tekstury bdcej celem renderowania ...................................................................542
Wyodrbnianie powierzchni z tekstur bdcych celem renderowania ...................................543
Renderowanie do tekstury.......................................................................................................544
Renderowanie do dynamicznej mapy szeciennej ..................................................................545
Rozmycie ruchu ......................................................................................................................547
Sposb tworzenia efektu rozmycia ruchu ...............................................................................548
Aplikacja rozmycia ruchu .......................................................................................................549
Wydajno techniki.................................................................................................................558
Podsumowanie ........................................................................................................................558

Rozdzia 34. Renderowanie 2D po prostu o jedn liter D mniej ........................561


Biedny DirectDraw. Wiedziaem, e to si tak skoczy.....................................................561
Krok 1: Odrzu jedn liter D .............................................................................................563
Duszki obrazy s wszystkim ..........................................................................................565
Wykorzystywanie wierzchokw w 2D ..................................................................................566
Bardzo prosta aplikacja 2D .....................................................................................................568
Wydajno...............................................................................................................................572
Moliwoci wykorzystania techniki 2D..................................................................................575
Podsumowanie ........................................................................................................................576

Rozdzia 35. DirectShow, czyli obraz ruchomy w postaci tekstury................................579


DirectShow w piguce.............................................................................................................579
MP3.........................................................................................................................................581
Dziaanie filtru wideo do tekstury...........................................................................................582
Czynnoci przygotowawcze przed utworzeniem klasy tekstury.............................................584
Klasa filtru teksturowego ........................................................................................................585
Aplikacja tekstury wideo ........................................................................................................593
Podsumowanie ........................................................................................................................595

Rozdzia 36. Przetwarzanie obrazu z wykorzystaniem mechanizmw pixel shader ......597


Zalety przetwarzania po etapie renderowania.........................................................................597
Penoekranowa regulacja kolorw z wykorzystaniem pixel shaderw ..................................598
Filtr czarno-biay ..............................................................................................................599
Regulacja jasnoci obrazu.................................................................................................600
Inwersja kolorw ..............................................................................................................601

Spis treci

13

Solaryzacja obrazu............................................................................................................602
Regulacja kontrastu sceny ................................................................................................603
Efekt sepii .........................................................................................................................605
Wykorzystywanie krzywych kolorw do modyfikacji kolorw.............................................607
Przetwarzanie obrazu z wykorzystaniem jder splotu ............................................................611
Wydajno...............................................................................................................................616
Podsumowanie ........................................................................................................................617

Rozdzia 37. Znacznie lepszy sposb wykrelania tekstu ..........................................619


Podstawy .................................................................................................................................620
Implementacja.........................................................................................................................621
Podsumowanie ........................................................................................................................634

Rozdzia 38. Dokadne odmierzanie czasu ................................................................635


Czas niskiej rozdzielczoci .....................................................................................................635
Czas wysokiej rozdzielczoci..................................................................................................636
Kilka oglnych sw na temat animacji..................................................................................637
Implementacja.........................................................................................................................639
Podsumowanie ........................................................................................................................641

Rozdzia 39. Bufor matrycy......................................................................................643


Znaczenie bufora matrycy oraz testu matrycy ........................................................................643
Stany renderowania bufora matrycy .......................................................................................645
Uaktywnianie bufora matrycy ..........................................................................................645
Ustawianie wartoci odniesienia dla testu ........................................................................645
Konfigurowanie funkcji porwnywania ...........................................................................646
Ustawianie operacji uaktualniania....................................................................................646
Maski matrycy ..................................................................................................................647
Celownik snajpera z wykorzystaniem bufora matrycy ...........................................................648
Podsumowanie ........................................................................................................................652

Rozdzia 40. Pobieranie informacji: kilka praktycznych procedur pobierania ..............655


Bardzo proste pobieranie 2D...................................................................................................655
Pobieranie za pomoc promieni..............................................................................................657
Poruszanie si w terenie z wykorzystaniem techniki pobierania za pomoc promienia ........659
Procedura pobierania na poziomie pikseli ................................................................................664
Vertex shader pobierania na poziomie pikseli ........................................................................665
Aplikacja pobierania na poziomie pikseli...............................................................................666
Inne zastosowania techniki pobierania na poziomie pikseli ...................................................671
Problemy wydajnoci..............................................................................................................673
Podsumowanie ........................................................................................................................673

Zakoczenie........................................................................................675
Skorowidz ...........................................................................................677

Rozdzia 16.

Mechanizmy pixel shader


Mechanizmy pixel shader s analogiczne do mechanizmw vertex shader, z t rnic,
e operuj na pikselach zamiast na wierzchokach. Po przeksztaceniach wierzchokw
nastpuje rasteryzacja trjktw na piksele, ktre s zapisywane do bufora zapasowego.
W poprzednich rozdziaach powiedzielimy, w jaki sposb operacje na wierzchokach,
kolorach i teksturach wpywaj na kolory uzyskiwane na ekranie. W tym rozdziale przedstawi pojcia zwizane z mechanizmami pixel shader. Pojcia te nabior bardziej realnego ksztatu w rozdziaach omawiajcych okrelone techniki. Ten rozdzia suy natomiast jako wstp do nastpujcych poj zwizanych z mechanizmami pixel shader:


Rne wersje mechanizmw pixel shader.

Dane wejciowe i wyjciowe mechanizmw pixel shader.

Warunkowe odczytywanie tekstur.

Instrukcje dostpne w mechanizmach pixel shader i czenie instrukcji w pary.

Modyfikatory w mechanizmach pixel shader.

Ograniczenia i ostrzeenia zwizane z mechanizmami pixel shader.

Sprawdzanie obsugi mechanizmw pixel shader.

Asemblacja i tworzenie mechanizmw pixel shader.

Prosta aplikacja wykorzystujca mechanizm pixel shader.

Co to jest pixel shader?


W poprzednich rozdziaach dowiedzielimy si, e rne operacje z kolorami maj wpyw
na czenie kolorw tekstury i wierzchokw w czasie rasteryzacji trjktw. Operacje
na kolorach dla fazy tekstury daj programicie niezwyk kontrol nad procesem czenia,
ale nie oferuj zbyt wielkich moliwoci. Mechanizmy pixel shader, podobnie jak mechanizmy vertex shader, pozwalaj na o wiele dokadniejsz kontrol nad sposobem
przetwarzania danych przez urzdzenie. W przypadku mechanizmw pixel shader dane,
o ktrych mowa, to piksele. Shader dziaa z kadym pikselem, ktry jest renderowany
na ekranie. Zwrmy uwag, e nie jest to kady piksel ekranu, a raczej kady piksel
wchodzcy w skad prymitywu renderowanego na ekranie. Na rysunku 16.1 przedstawiono

260

Cz IV

Mechanizmy shader

Rysunek 16.1.
Miejsce mechanizmu
pixel shader
w potoku

inne spojrzenie na dalsze etapy renderowania pokazane na rysunku 5.1. Jak widzimy,
shader ma wpyw na kolorowanie danego prymitywu, ale przetworzony przez shader
piksel, zanim trafi na ekran, nadal musi by poddany testowi alfa, gbi i matrycy.
Pixel shader przetwarza kady piksel renderowanego prymitywu, ale niekoniecznie kady
piksel ekranu czy okna wyjciowego. Oznacza to, e pixel shader ma wpyw na wygld
okrelonego trjkta, czy te obiektu. Pixel shader zajmuje miejsce stanw czenia tekstury i pozwala na dokadniejsze zarzdzanie przezroczystoci i kolorem dowolnego
wykrelanego obiektu. Jak przekonamy si w dalszych rozdziaach, ma to swoje implikacje dotyczce owietlenia, cieniowania oraz wielu innych operacji na kolorach.
Prawdopodobnie jedn z najwikszych zalet mechanizmw pixel shader jest to, e upraszczaj one przedstawianie zoonych operacji czenia tekstur. Stany faz tekstur wymagaj
ustawiania operacji na teksturach, argumentw, wspczynnikw czenia oraz kilku innych
stanw. Stany te pozostaj w mocy, dopki nie zostan jawnie zmienione. W wyniku
tego skadnia jest czasami niezgrabna, a czasami trudno kontrolowa wszystkie ustawienia. Mechanizmy pixel shader zamieniaj wywoania metody  
seri stosunkowo prostych instrukcji arytmetycznych z przejrzycie zdefiniowanymi argumentami. Kiedy ju zapoznamy si z mechanizmami pixel shader, z pewnoci oka si
one bardzo przydatne.

Wersje mechanizmw pixel shader


Specyfikacja mechanizmw pixel shader zmienia si bardziej gwatownie oraz w bardziej
istotny sposb ni specyfikacja mechanizmw vertex shader. Istnieje wersja 1.0, ale zamiast
niej powinnimy wykorzystywa wersj 1.1. Obecnie prawie wszystkie rodzaje sprztu
obsugujce mechanizm pixel shader obsuguj wersj 1.1, ale istniej implementacje
sprztowe dla wersji 1.2, 1.3 oraz 1.4. Pniejsze wersje w wielu aspektach rozszerzaj
moliwoci. Pomimo to techniki pokazane w dalszych rozdziaach bd ograniczay si
do wersji 1.1. W tym rozdziale opisz waciwoci wszystkich wersji i zaznacz te waciwoci, ktre s dostpne tylko w wersjach pniejszych. Jeeli nie zaznacz inaczej,
to mona zaoy, e okrelony opis dotyczy wszystkich wersji.

Rozdzia 16.

Mechanizmy pixel shader

261

Mechanizmy pixel shader, a mechanizmy vertex shader


Wersja 1.1. mechanizmu pixel shader jest do ograniczona w porwnaniu z wersj 1.1 mechanizmu vertex shader. Pniejsze wersje zawieraj bardziej zaawansowane funkcje odczytywania tekstur oraz oferujce wiksze moliwoci funkcje porwna. Zakres moliwoci mechanizmw pixel
shader stopniowo zblia si do zakresu oferowanego przez mechanizmy vertex shader.

Wejcia, wyjcia
oraz operacje realizowane
przez mechanizmy pixel shader
Tak jak w przypadku mechanizmw vertex shader, dziaania wykonywane przez mechanizm pixel shader s uzalenione od zbioru danych wejciowych, zbioru instrukcji
oraz rejestrw sucych do przechowywania wynikw. Architektur mechanizmu pixel
shader pokazano na rysunku 16.2.
Rysunek 16.2.
Architektura
mechanizmu
pixel shader

Poniej umieszczono opis kadego z komponentw mechanizmu pixel shader. W tym


rozdziale umieszcz tylko zwizy opis. Pozostae informacje znajd si w rozdziaach
nastpnych.

Rejestry kolorw
Rejestry kolorw
oraz
to najprostsze rejestry wejciowe. Kady z nich posiada
cztery wartoci skadowych koloru, ktre odpowiadaj rejestrom wyjciowym  oraz
 mechanizmu vertex shader. Mona je wykorzysta do przekazywania danych o kolorach, wsprzdnych tekstury lub nawet wektorach, ktre maj wpyw na czenie lub
kolorowanie wynikowych pikseli.

262

Cz IV

Mechanizmy shader

Rejestry tymczasowe i wyjciowe


Podobnie jak w przypadku rejestrw mechanizmu vertex shader, rejestry tymczasowe
su do zapisywania tymczasowych danych wykorzystywanych przez kolejne instrukcje
shadera. Istniej cztery skadowe wartoci koloru zapisane jako liczby zmiennoprzecinkowe. Inaczej ni w mechanizmach vertex shader, warto  oznacza ostateczn warto
koloru uzyskan w wyniku dziaania shadera. Warto  moemy wykorzysta take
jako rejestr tymczasowy, ale warto znajdujca si w tym rejestrze po zakoczeniu
dziaania shadera bdzie przekazana do dalszych etapw potoku. Pamitajmy te, e
wartoci rejestrw tymczasowych s wewntrz shadera interpretowane jako wartoci
zmiennoprzecinkowe, ale warto  przed zakoczeniem dziaania shadera jest przeliczana na warto z zakresu od 0,0 do 1,0.

Rejestry staych
Stae mechanizmu pixel shader maj dokadnie tak sam posta i dziaanie jak stae
mechanizmw vertex shader poza tym, e ich wartoci powinny mieci si w zakresie
od 1,0 do 1,0. W wielu przypadkach spotkamy si z definiowaniem staych wewntrz
mechanizmu pixel shader. W wikszoci technik zwizanych z mechanizmami pixel shader
wartoci stae s rzeczywicie stae, co oznacza, e nigdy si nie zmieniaj. Zmodyfikowane wartoci mona przekaza do mechanizmu pixel shader za pomoc mechanizmu
vertex shader. Jeli jest taka potrzeba, to wartoci staych mona take przekaza do mechanizmu pixel shader za pomoc wywoa API.

Rejestry tekstur
Rejestry tekstur dostarczaj do mechanizmu pixel shader informacji o teksturach. Z technicznego punktu widzenia rejestry tekstur zawieraj wsprzdne tekstur, ale w wikszoci
przypadkw informacje te s natychmiast zamieniane na dane o kolorach w miar pobierania danych o teksturze. W shaderach wersji od 1.1 do 1.4 rejestry tekstur mog by
odczytywane jako wsprzdne, a nastpnie zapisywane danymi o kolorach. W wersji 1.4.
mog by jedynie odczytywane i s wykorzystywane jako parametry suce do zaadowania danych o kolorach do innych rejestrw. Dokadne przeznaczenie tych rejestrw
stanie si bardziej jasne po omwieniu instrukcji dostpnych dla shadera. Liczba rejestrw
tekstur zaley od liczby faz tekstur.

Warunkowe odczytywanie tekstur


W wikszoci przypadkw rejestry tekstur wykorzystuje si do prbkowania danych na
podstawie wsprzdnych tekstury przekazanych z mechanizmu vertex shader. Celem
dziaania niektrych instrukcji pixel shadera jest jednak modyfikowanie wsprzdnych
tekstury wewntrz pixel shadera, przed odczytaniem rzeczywistej wartoci tekstury. Tak
operacj nazywa si warunkowym odczytywaniem tekstury, poniewa wsprzdne wykorzystywane do pobierania wartoci tekstury zale od pewnych wczeniejszych operacji
wykonywanych przez pixel shader, a nie tylko od czynnikw zewntrznych. Graficzn
reprezentacj operacji warunkowego odczytu tekstury pokazano na rysunku 16.3.

Rozdzia 16.

Mechanizmy pixel shader

263

Rysunek 16.3.
Zwyke i warunkowe
odczytywanie tekstur

Operacja warunkowego odczytu tekstur pozwala programicie na tworzenie szeregu faz


tekstur, ktre poszukuj wartoci dla kadej kolejnej fazy. Przykadowo, istniej techniki,
w ktrych vertex shader dostarcza wsprzdnych tekstury, ktra z kolei zawiera wartoci
koloru wykorzystywane jako wsprzdne tekstury w innej teksturze. Przy prawidowym
wykorzystaniu operacje warunkowego odczytywania tekstur mog stworzy podstaw
do implementacji funkcji matematycznych, ktre oferuj znacznie wiksze moliwoci
wykonywania operacji, ni w przypadku zastosowania stanw faz tekstur. W nastpnym
podrozdziale powiconym instrukcjom opisano to w sposb bardziej szczegowy.

Instrukcje dostpne
w mechanizmach pixel shader
Instrukcje pixel shadera dziaaj na wartociach rejestrw wejciowych i tymczasowych
w podobny sposb jak instrukcje vertex shadera. Istnieje jednak kilka istotnych rnic.
Pierwsza rnica polega na tym, e pixel shadery obsuguj znacznie mniejsz liczb
instrukcji. Ogranicza to moliwoci shaderw, ale w praktyce jest sensowne, ze wzgldu
na czstotliwo zastosowania mechanizmu pixel shader. Pomijajc moliwoci sprztu,
pisanie dugich shaderw, ktre miayby przetwarza miliony pikseli w pojedynczej ramce,
wydaje si bezcelowe. Inna rnica polega na zastosowaniu modyfikatorw instrukcji.
Modyfikatory instrukcji stanowi cenny dodatek do zestawu instrukcji shadera. Modyfikatory omwimy w nastpnym podrozdziale.
Niewygodne jest to, e rne wersje mechanizmw pixel shader w pewnym stopniu obsuguj rny zestaw instrukcji. W objanieniach zamieszczonych poniej dla kadej instrukcji wymieniam zestaw wersji shaderw, ktre j obsuguj. W przypadku braku takiej
listy bdziemy mogli przyj, e instrukcja jest obsugiwana we wszystkich dostpnych
obecnie wersjach.
Istniej trzy generalne grupy instrukcji. Nazwaem je instrukcjami konfiguracji, instrukcjami
arytmetycznymi oraz instrukcjami adresowania tekstur. Kategoria instrukcji konfiguracyjnych stanowi w pewnym sensie rodzaj kategorii dodatkowej dla trzech instrukcji, ktre
nie pasuj do pozostaych kategorii. Instrukcje konfiguracyjne wymieniono w tabeli 16.1.

264

Cz IV

Mechanizmy shader

Tabela 16.1. Instrukcje konfiguracyjne dostpne w pixel shaderach


Instrukcja

Opis



Instrukcja  informuje shader, ktrej wersji shadera uywamy. Obecnie najczciej


wykorzystywana wersja to 1.1, ale wkrtce zapewne bardziej popularne bd wersje nowsze.



Instrukcja  definiuje warto staej jako wektor skadajcy si z czterech skadowych.
Instrukcja ta przydaje si do ustawiania wartoci, ktre nie zmieniaj si w cigu caego
czasu istnienia shadera.



Ta instrukcja jest unikatowa dla wersji 1.4. Wersja 1.4 pozwala na rozdzielenie pixel shadera
na dwie rne fazy dziaania, co w rezultacie pozwala na podwojenie liczby instrukcji
dozwolonych do wykorzystania wewntrz mechanizmu pixel shader. Wartoci kolorw
ustawione podczas jednej z faz shadera przechodz do fazy drugiej, ale wartoci kanau alfa
nie musz by takie same. Jeeli shader nie zawiera instrukcji , urzdzenie uruchamia
shader, tak jakby znajdowa si w ostatniej fazie (tylko wersja 1.4).

W tabeli 16.2 zestawiono instrukcje arytmetyczne. Wikszo spord tych instrukcji jest
przynajmniej czciowo obsugiwana we wszystkich wersjach shaderw. Naley zachowa ostrono, gdy niektre z nich albo nie s obsugiwane, albo zuywaj wicej ni
jeden cykl.

czenie instrukcji w pary


Pixel shader przetwarza dane opisu koloru oraz kanau alfa w dwch rnych potokach.
Dziki temu istnieje moliwo zdefiniowania dwch zupenie rnych instrukcji dla
dwch potokw, ktre wykonuj si jednoczenie. Przykadowo, moemy zastosowa
instrukcj  dla danych RGB, ale dane kanau alfa moemy tylko przesa z jednego
rejestru do drugiego. Mona to zrobi w nastpujcy sposb:



 
 
  

Istniej pewne ograniczenia dotyczce tego, ktre instrukcje wolno czy w pary. Wedug
niepisanej reguy, nie naley grupowa instrukcji o najwikszych ograniczeniach. Bez
przeszkd mona czy w pary proste operacje arytmetyczne.

Instrukcje adresowania tekstur


Instrukcje adresowania tekstur mog zapewnia wiksze moliwoci ni instrukcje arytmetyczne. Jednoczenie ich uycie moe by bardziej kopotliwe. W tabeli 16.3 zwile
opisano instrukcje adresowania tekstur. Niektre z tych instrukcji omwi bardziej szczegowo w dalszych rozdziaach opisujcych techniki.
W przypadku instrukcji adresowania tekstur czsto trudno zrozumie, kiedy wykorzystujemy parametr  do przechowywania danych opisu wsprzdnych tekstury, a kiedy
parametr ten zawiera dane o kolorach. Dla wyjanienia poniej podaem kilka przykadw
tego, w jaki sposb wsprzdne tekstury odpowiadaj wartociom opisujcym kolory
oraz rejestrom wynikowym opisu tekstur.

Rozdzia 16.

Mechanizmy pixel shader

265

Tabela 16.2. Instrukcje arytmetyczne w mechanizmach pixel shader


Instrukcja Format

Opis



 


Przesya warto z jednego rejestru do drugiego. Instrukcja ta przydaje si


do przekazywania tymczasowych wartoci do rejestru
, ktry zawiera
ostateczny wynik dziaania shadera.



 
Dodaje jedn warto rejestru do drugiej i umieszcza wynik w rejestrze
  wynikowym.



 
Odejmuje jedn warto rejestru od drugiej i umieszcza wynik w rejestrze
  wynikowym. Pixel shadery obsuguj take negacj rejestrw, a zatem
mona wykorzysta instrukcj  z zanegowanym parametrem wejciowym.



 



Mnoy jedn warto rejestru przez drug i umieszcza wynik w rejestrze


wynikowym. Podobnie jak vertex shadery, pixel shadery nie obsuguj
instrukcji dzielenia. Jeeli chcemy podzieli liczb, powinnimy przekaza
do shadera jej odwrotno.



 




Podobnie jak instrukcja  dostpna dla vertex shaderw, ta instrukcja


wykonuje mnoenie i dodawanie w pojedynczej instrukcji.
Najpierw wykonywane jest mnoenie parametru  przez ,
a nastpnie do obliczonego iloczynu dodawana jest warto  .
Wynik umieszczany jest w rejestrze wynikowym.



 



Ta instrukcja wykonuje trjelementow operacj iloczynu skalarnego


pomidzy wartociami zapisanymi jako parametry  i .
Zakada si, e wartoci te s wektorami, chocia mona wykorzysta t
operacj do innego celu. Instrukcj t wykorzystano w rozdziale 31.



 



Instrukcja taka jak , z t rnic, e dotyczy czterech elementw.


Instrukcja jest dostpna w wersji 1.2 i w wersjach wyszych.
W wersjach 1.2 oraz 1.3. liczy si j jako dwie instrukcje (1.2, 1.3, 1.4).



 




Ta instrukcja warunkowa ustawia wartoci w rejestrze wynikowym na


podstawie tego, czy wartoci komponentw s wiksze ni 0,5.
W wersji 1.4 ta instrukcja dziaa dla kadego komponentu oddzielnie.
Jeeli ktrykolwiek z komponentw parametru  jest wikszy
ni 0,5, odpowiadajcy mu komponent rejestru wynikowego jest ustawiany
na warto komponentu parametru ; w przeciwnym wypadku
warto jest pobierana z parametru  . Jest moliwe zatem, e wynik
jest swego rodzaju kompozycj wartoci parametru i  .
We wszystkich wersjach wczeniejszych ni 1.4. warto porwnywana
jest ograniczona do jednej wartoci
  (1.1, 1.2, 1.3, 1.4
z ograniczeniami opisanymi powyej).



 




Operacja podobna do , ale tym razem komponenty wejciowe s


porwnywane z wartoci 0,0. Jeeli s wiksze lub rwne 0,0,
wybierana jest warto pochodzca z parametru , w innym
przypadku pobierana jest warto z parametru  . Instrukcja jest
dostpna w wersji 1.2 i w wersjach pniejszych, ale w wersjach 1.2 i 1.3
traktuje si j jako dwie instrukcje (1.2, 1.3, 1.4 z ograniczeniami).





 




Instrukcja 
 wykonuje liniow interpolacj wartoci zawartych
w parametrach  i  na podstawie parametru .
Przykadowo, pojedyncza warto wyniku jest obliczana jako 

!
" 
#  !
" !  $ 
##.



 
%



Ta instrukcja jest dostpna tylko w wersji 1.4. Oblicza symulowan warto


rodowiskowego odwzorowania nierwnoci na podstawie ustawienia
stanu macierzy nierwnoci fazy tekstury.





Ta instrukcja nie wykonuje adnych dziaa.

266

Cz IV

Mechanizmy shader

Tabela 16.3. Instrukcje adresowania tekstur dostpne w mechanizmach pixel shader


Instrukcja

Format

Opis

&'

&' &!#

Instrukcja aduje warto z wybranej fazy tekstury na podstawie


wsprzdnych tekstury dla tej fazy. Podstawowym zastosowaniem
tej instrukcji jest pobieranie wartoci do przetwarzania. Instrukcja &'
nie jest dostpna w wersji 1.4. W wersji 1.4. shadery wykorzystuj
instrukcj &' (1.1, 1.2, 1.3).

&'

&'
!# &!#

Instrukcja aduje warto koloru z tekstury do rejestru tymczasowego.


W tym przypadku rejestr tekstury &!# zawiera wsprzdne tekstury,
natomiast rejestr
!# zawiera dane tekstury. Z tego powodu wiersz
&'
, & pobiera wsprzdne tekstury z fazy 0 i wykorzystuje je
w celu odszukania wartoci koloru w teksturze fazy 2. Wartoci koloru
s zapisywane do rejestru
(tylko 1.4.)

&'


&'
  &!#

W wersji 1.4. instrukcja &'


 kopiuje dane zawierajce wsprzdne
tekstury z rejestru &!# do rejestru wynikowego, jako dane opisujce
kolor. W drugim etapie dziaania pixel shadera mona wykorzysta
rejestr wynikowy jako rdo w wywoaniu instrukcji &', ale tylko
w etapie 2 (tylko 1.4).

&'


&'
 &!#

&'
 jest w pewnym sensie instrukcj towarzyszc instrukcji &'
i instrukcj analogiczn do &'
. Jeeli shader wywoa t instrukcj
zamiast &', dane opisu wsprzdnych tekstury bd zaadowane
zamiast wartoci opisujcej kolor. Instrukcja moe by przydatna
w tych technikach, gdzie vertex shader przekazuje dane do pixel
shadera poprzez wsprzdne tekstury (1.1, 1.2, 1.3).

&'
 

&'
 
&!#
&!#

Ta instrukcja interpretuje komponenty kanau alfa oraz koloru


czerwonego rejestru &!# jako wsprzdne tekstury u oraz v.
Te wsprzdne tekstury s wykorzystywane jako indeks do rejestru
&!# w celu pobrania wartoci opisu koloru z tej fazy tekstury.
Przykadowo, vertex shader moe ustawi wsprzdne tekstury
z fazy 0 na (0,0). Komponenty kanau alfa oraz koloru czerwonego
w tym punkcie w teksturze mog obydwa mie warto 0,5. Z tego
powodu moemy wykorzysta wsprzdne (0,5; 0,5) do odszukania
wartoci teksela wewntrz rejestru &. Wewntrz pixel shadera
odpowiedni wiersz kodu przyjby posta &'
 
&, &. Docelowa
faza tekstury musi by wiksza od rdowej. (1.1, 1.2, 1.3).

&'
 

&'
  &!#
&!#

Instrukcja analogiczna do instrukcji &'


 
, z t rnic, e jako
wsprzdne tekstury wykorzystywane s komponenty koloru
zielonego i niebieskiego. (1.1, 1.2, 1.3).

&'



&'

 &!#
&!#

Instrukcja taka sama jak poprzednie, ale wykorzystuje trzy wsprzdne


tekstury do zastosowania w odwzorowaniach szeciennych lub
teksturach 3D (tylko 1.2 i 1.3).

&'

&' &!#

Ta instrukcja zabija biecy piksel, jeeli dowolna z trzech


pierwszych wsprzdnych tekstury jest mniejsza ni zero.
Instrukcja moe by przydatna do implementacji paszczyzn
obcinanych (ang. clipping planes), ale moe powodowa niepodane
wyniki w przypadku stosowania wieloprbkowania (ang. multisampling).
W wersji 1.4 w etapie 2 rejestr wejciowy moe by rejestrem
tymczasowym ustawionym w etapie 1.

Rozdzia 16.

Mechanizmy pixel shader

267

Tabela 16.3. Instrukcje adresowania tekstur dostpne w mechanizmach pixel shader cig dalszy
Instrukcja

Format

Opis

&'' 

&''  &!#


&!#

Ta instrukcja wykonuje pierwsz cz oblicze dla macierzy 32.


Wartoci w rejestrze &!# (z reguy wektory) s mnoone przez
pierwsze trzy wartoci wsprzdnych tekstury fazy m, ktre w tym
przypadku s wykorzystywane jako pierwszy wiersz macierzy 32.
Instrukcj t moemy zastosowa tylko razem z instrukcj &'' &'
lub &'' & (opisane dalej). Nie mona uy jej samej.
Instrukcj t naley traktowa jako pierwsz cz instrukcji
dwuczonowej (1.1, 1.2, 1.3).

&'' &'

&'' &' &!#


&!#

Jest to druga cz instrukcji poprzedniej. Rejestr docelowy musi


pochodzi z fazy tekstury wyszej ni pozostae dwie fazy. Instrukcja
ta wykonuje drug cz mnoenia macierzy 32. Rejestr &!# jest
mnoony przez drugi wiersz macierzy (zapisanej jako wsprzdne
tekstury dla fazy ). Wynik jest nastpnie wykorzystywany jako
parametr wyszukiwania w teksturze fazy . W wyniku dziaania tej
instrukcji rejestr &!# zawiera poszukiwany kolor. Instrukcj t
najlepiej wytumaczy na przykadzie. Instrukcje tego typu i podobne
wykorzystano w rozdziale 32. (1.1, 1.2, 1.3)

&'' & &'' &


&!# &!#

Jest to druga, alternatywna cz instrukcji &'' . Jeeli stosujemy


t instrukcj, to do obliczenia wartoci z dla tego piksela powinnimy
uy funkcji &''  (na podstawie pierwszego wiersza macierzy).
Instrukcja ta oblicza wsprzdn w, wykorzystujc wsprzdne z fazy
 jako drugi wiersz macierzy. Nastpnie instrukcja oblicza wsprzdne
z/w i zaznacza t warto do wykorzystania jako alternatywn warto
gbokoci dla wybranego piksela (tylko 1.3).

&''

&'' &!#
&!#

Ta instrukcja dziaa tak samo jak instrukcja &'' , z t rnic,


e przetwarza macierz 33. Z tego powodu przed dopenieniem
instrukcji za pomoc &''&', &'' lub &''
instrukcj t trzeba wywoa dwukrotnie (1.1, 1.2, 1.3).

&''&'

&''&' &! #
&!#

Podobnie jak instrukcja &'' &', ta instrukcja jest uzupenieniem


penej operacji macierzowej. W tym przypadku jest to mnoenie
macierzy 33. Zakada si, e wywoanie instrukcji poprzedzono
dwoma wywoaniami instrukcji &'' oraz e kada kolejna
wykorzystana faza bya wysza od poprzedniej. Wynik mnoenia
wykorzystywany jest jako wsprzdne tekstury w celu pobrania
wartoci tekstury z &! # (1.1, 1.2, 1.3).

&''

&'' &! # Jest to alternatywa dla instrukcji &''&'. Wynik mnoenia


&!# !#
macierzy 33 jest interpretowany jako wektor normalny wykorzystywany

do oblicze odbicia. Rejestr !# przechowuje sta wektora oka


odpowiadajc tej instrukcji dla wynikowego wektora normalnego.
Uzyskany w wyniku wektor 3D wykorzystywany jest jako zbir
wsprzdnych tekstury dla tekstury w fazie . Instrukcj t stosuje
si do mapowania rodowiskowego (1.1, 1.2, 1.3).
&'' &''
&! # &!#

Instrukcja podobna do instrukcji &'', ale bez wykorzystania


staego wektora oka. W zamian wektor oka jest pobierany z czwartego
komponentu wierszy macierzy (1.1, 1.2, 1.3).

&''

Ta instrukcja take moe uzupenia cig trzech instrukcji. Jej dziaanie


polega na przesaniu wektora wynikowego do rejestru wyniku bez
wykonywania poszukiwania danych opisu tekstury (1.2, 1.3).

&'' &! #
&!#

268

Cz IV

Mechanizmy shader

Tabela 16.3. Instrukcje adresowania tekstur dostpne w mechanizmach pixel shader cig dalszy
Instrukcja

Format

Opis

&'

&' &!# &!#

Ta instrukcja oblicza informacje dotyczce pozornego rodowiskowego


mapowania nierwnoci za pomoc macierzy nierwnoci ustawionej
za pomoc wywoania funkcji (&)'&
(& (&&. Wartoci koloru
w rejestrze &!# s mnoone przez macierz tekstury, a wynik jest
wykorzystywany jako indeks tekstury w fazie m (1.1, 1.2, 1.3).

&'

&' &!# &!#

Instrukcja stanowi uzupenienie instrukcji &'. Wykonuje t sam


funkcj, ale dodatkowo uwzgldnia korekt luminancji ze stanw faz
tekstur.

&'&

&'&
!#

Tej instrukcji mona uy jedynie w drugim etapie w shaderach


wersji 1.4. W pierwszym etapie naley wypeni komponenty r i g
rejestru za pomoc wartoci z i w. Instrukcja oblicza warto z/w
i zaznacza t warto do zastosowania jako warto gbi dla tego
piksela. (1.4. tylko w drugim etapie).

&'

&' &!# &!#

Instrukcja oblicza trjelementowy iloczyn skalarny danych zapisanych


w rejestrze &!# oraz wsprzdnych tekstury zapisanych w rejestrze
&!#. Uzyskana w wyniku warto skalarna jest kopiowana do wszystkich
czterech komponentw rejestru &!# (1.2, 1.3).

&'&'

&'&' &!#
&!#

Ta instrukcja oblicza iloczyn skalarny tak jak instrukcja poprzednia,


ale uzyskany w wyniku skalar jest uywany jako indeks do poszukiwania
danych w teksturze fazy . Uzyskana w wyniku warto koloru jest
zapisywana do rejestru &!# (1.2, 1.3).

W poniszym przypadku tekstura w fazie 0 jest prbkowana razem ze wsprzdnymi


tekstury z fazy 0. Uzyskany w wyniku kolor jest zapisywany do  . Kolejne instrukcje
uywajce  bd wykorzystyway prbkowan warto koloru:
&' &

W kolejnym przykadzie rejestr  jest zapisywany wartoci wsprzdnych tekstury


z fazy 0. Kolejne instrukcje wykorzystujce rejestr  bd wykorzystywa dane opisu
wsprzdnych tekstury interpretowane jako warto koloru:
&'
 &

Kolejny fragment kodu wykorzystuje pierwsze dwie wsprzdne tekstury z fazy 0 jako
wsprzdne tekstury w fazie 1. Tekstura fazy 1. jest prbkowana, a uzyskany w wyniku
kolor jest zapisywany do rejestru  . Kolejne instrukcje korzystajce z rejestru  bd
wykorzystyway warto koloru z prbki tekstury fazy 1.
&'
 
& &

We wszystkich wersjach shaderw wczeniejszych ni 1.4 rejestry  mog by zarwno


odczytywane, jak i zapisywane. W przypadku odczytu uzyskana dana jest interpretowana
jako wsprzdna tekstury. W przypadku zapisu warto moe zawiera prbkowan
warto koloru tekstury lub na przykad interpretowan wsprzdn tekstury (w przypadku instrukcji  ). W wersji 1.4. rejestry tekstury mog by tylko odczytywane.
W przypadku poniszej instrukcji  rejestr  zawiera wsprzdne tekstury, natomiast
 zawiera wynik zastosowania tych wsprzdnych do prbkowania tekstury fazy 0:
&'
 &

Rozdzia 16.

Mechanizmy pixel shader

269

W dalszych rozdziaach niektre z opisanych wczeniej instrukcji zostan zaprezentowane w praktycznym dziaaniu. Kiedy zobaczymy, jak si ich uywa, nabior dla nas
wikszego sensu.
Moliwoci przetwarzania nie s ograniczone jedynie do zestawu instrukcji. Podobnie
jak w przypadku mechanizmw vertex shader, pixel shadery umoliwiaj zastosowanie
modyfikatorw, ktre daj wiele moliwoci.

Modyfikatory dostpne
dla mechanizmw pixel shader
W pixel shaderach mona stosowa niektre spord dodatkowych funkcji dostpnych
dla vertex shaderw, takich jak negacja czy maski zapisu, ale istnieje take zbir modyfikatorw instrukcji, ktre gwarantuj dodatkowe moliwoci. Dostpne modyfikatory
dla rejestrw rdowych zestawiono w tabeli 16.4.
Tabela 16.4. Modyfikatory rejestrw rdowych dostpne dla pixel shaderw
Modyfikator Skadnia

Opis

Przesunicie

*

Odejmuje 0,5 od wszystkich czterech komponentw rejestru. Ten modyfikator


mona stosowa dla dowolnego rejestru rdowego.

Odwrcenie

$


Przed wykonaniem instrukcji nastpuje odjcie wartoci rejestru rdowego


od 1,0. Zawarto rejestru rdowego nie zmienia si.

Negacja

$


Oblicza negacj komponentw przed wykonaniem instrukcji. Znw zawarto


rejestru rdowego nie zmienia si.

Podwojenie

*'

Ten modyfikator przed wykonaniem instrukcji mnoy komponenty przez 2,0.


Jest dostpny tylko w wersji 1.4.

Skala ze
znakiem

*'

Ten modyfikator odejmuje warto 0,5, a nastpnie mnoy uzyskany wynik


przez 2,0. Modyfikator szczeglnie przydaje si do wykonywania konwersji
zakresu koloru od 0,0 do 1,0 na zakres od 1,0 do 1,0.

W pixel shaderach jest take dostpna ograniczona forma operacji mieszania. Przed
wykonaniem instrukcji moemy dokona replikacji jednego kanau na wszystkie kolory.
Podobnie jak w przypadku operacji mieszania dostpnej w vertex shaderach odpowiednie rejestry danych nie ulegaj zmianie. Odpowiednie selektory rejestrw rdowych
zestawiono w tabeli 16.5.
Mona take stosowa maski zapisu. We wszystkich wersjach shaderw mona wybra,
czy bdziemy zapisywa wszystkie kanay, tylko kana alfa, czy tylko kolory. W wersji
1.4 do zapisu mona wybra dowolne kanay. Skadnia masek zapisu jest taka sama jak
w przypadku mechanizmw vertex shader, z t rnic, e zamiast etykiet .xyzw stosujemy etykiety .rgba, co pokazano w tabeli 16.5.
Ostatni grup modyfikatorw s modyfikatory instrukcji. O dziaaniu tych modyfikatorw
moemy myle jako o operacji wykonywanej przed ustawieniem wartoci wyniku. Tego
typu modyfikatory opisano w tabeli 16.6. W przykadach posuono si instrukcj ,
ale modyfikatorw tych mona uy dla wikszoci instrukcji arytmetycznych.

270

Cz IV

Mechanizmy shader

Tabela 16.5. Selektory rejestrw rdowych w mechanizmach pixel shader


Selektor

Skadnia Opis

Replikacja kanau
alfa

 

Ten selektor replikuje warto kanau alfa do wszystkich komponentw


rejestru wejciowego. Selektor jest dostpny we wszystkich wersjach shadera.

Replikacja kanau
niebieskiego

 

Replikuje warto kanau niebieskiego do wszystkich komponentw


rejestru wejciowego. Selektor jest dostpny we wszystkich wersjach
shadera w wersji 1.1 i w wersjach pniejszych.

Replikacja kanau
zielonego

Replikuje warto kanau zielonego do wszystkich kanaw.


Dostpny jedynie w wersji 1.4.

Replikacja kanau
czerwonego

Replikuje warto kanau czerwonego do wszystkich kanaw.


Dostpny jedynie w wersji 1.4.

Tabela 16.6. Modyfikatory instrukcji w mechanizmach pixel shader


Modyfikator

Skadnia Opis

Mnoenie przez 2

*'

Ten modyfikator mnoy wynik instrukcji przez 2.

Mnoenie przez 4

*'

Mnoy wynik przez 4.

Mnoenie przez 8

*'+

Mnoy wynik przez 8. Dostpny jedynie w wersji 1.4.

Dzielenie przez 2

*

Dzieli wynik przez 2.

Dzielenie przez 4

*

Dzieli wynik przez 4. Dostpny tylko w wersji 1.4.

Dzielenie przez 8

*+

Dzieli wynik przez 8. Dostpny tylko w wersji 1.4.

Nasycenie

*&

Konwertuje wynik do zakresu 0,0 1,0. Modyfikator nasycenia zapewnia,


e wartoci mieszcz si w poprawnym zakresie dla kolorw.

Ograniczenia i uwagi dotyczce


stosowania mechanizmw pixel shader
Podobnie jak w przypadku mechanizmw vertex shader podstawowym ograniczeniem
mechanizmw pixel shader jest liczba instrukcji. Pixel shadery podlegaj znacznie ostrzejszym ograniczeniom ni vertex shadery. W wersjach 1.1, 1.2 i 1.3 istnieje ograniczenie
do 4 instrukcji adresowania tekstur oraz 8 instrukcji arytmetycznych, co daje w sumie 12
instrukcji. Wersja 1.4 dopuszcza 8 instrukcji arytmetycznych oraz sze instrukcji adresowania tekstur dla kadego z dwch etapw. W sumie daje to 28 dostpnych instrukcji. Jest
to ponad dwukrotna liczba instrukcji w porwnaniu z wersjami poprzednimi, ale w dalszym
cigu duo mniejsza od liczby instrukcji dostpnych w mechanizmach vertex shader.
Chocia istnieje ograniczenie co do liczby instrukcji adresowania oraz instrukcji arytmetycznych, to nie ma ogranicze co do liczby instrukcji konfiguracyjnych. Instrukcje
,  oraz  nie zajmuj dostpnego limitu liczby instrukcji.
Innym ograniczeniem jest liczba dostpnych rejestrw. W tabeli 16.7 zestawiono ograniczenia liczby rejestrw dla wszystkich wersji mechanizmw pixel shader.

Rozdzia 16.

Mechanizmy pixel shader

271

Tabela 16.7. Ograniczenia liczby rejestrw w mechanizmach pixel shader


Typ rejestru

Ograniczenie w wersjach 1.1 1.3 Ograniczenie w wersji 1.4

Rejestr koloru !#

2 (etap 2)

Rejestr tekstury &!#

Rejestr staych !#

Rejestr tymczasowy
!#

Pixel shadery s ograniczone przez sprzt, na ktrym dziaaj. Niektre karty by moe
w ogle nie bd obsugiway adnej z wersji pixel shader. Inaczej ni w przypadku mechanizmw vertex shader, dla pixel shaderw nie ma akceptowalnej alternatywy programowej. Jeeli sprzt ich nie obsuguje, wydajno jest przeraliwie niska. Urzdzenie
referencyjne moe suy do testowania kodu, ale nie do rzeczywistego wykorzystania.

Sprawdzanie dostpnoci
mechanizmw pixel shader
Podobnie jak w przypadku mechanizmw vertex shader, mona sprawdzi, czy nasz
sprzt obsuguje pixel shadery, poprzez wywoanie metody 
. Struktura
  zawiera pole typu  ! "# . Warto zawiera zarwno numer
wersji gwnej, jak numery wersji pomocniczych. Najlepiej analizowa znaczenie tej
wartoci za pomoc makra "$#%!& ':
,,-./(+ 012
*3,,$45&,-!,,.,./)67*,68.9:) ,,,6;)</6*=.: >01#2
 !01 /'(
;
 ,,/(*;67(?@A!#
B
 !8.?:6,!9&3
1/
&.3@!*3& ,,,6;)</6*=.:
,,-76.)6*=.7,.76*;67)6C/7@-6((?A5###

&
 8.:(62
D

Uzyskany numer wersji to wersja maksymalna. Urzdzenia obsugujce dan wersj


shadera powinny take obsugiwa wersje wczeniejsze. Jeeli urzdzenie nie obsuguje
mechanizmw pixel shader, by moe konieczne bdzie opracowanie techniki zastpczej wykorzystujcej operacje czenia tekstur lub wyczenie niektrych efektw. Jeeli
mechanizmy pixel shader s dostpne, moemy zrobi krok naprzd i przystpi do
utworzenia shadera.

Asemblacja, tworzenie i wykorzystywanie


mechanizmw pixel shader
Asemblacja pixel shaderw jest dziaaniem podobnym do asemblacji vertex shaderw.
Naley wykorzysta to samo wywoanie funkcji ()*+ (zobacz poprzedni

272

Cz IV

Mechanizmy shader

rozdzia). Jeeli skadnia jest poprawna, to skompilowany shader znajdzie si w buforze


shadera. Skompilowany shader moe posuy do waciwego utworzenia shadera.
Kolejn czynnoci jest wywoanie funkcji ". Jest to funkcja podobna
do funkcji #, ale niewymagajca deklaracji. Pixel shadery zawsze
operuj na wartoci koloru skadajcej si z czterech komponentw, niezalenie od formatu tekstury lub bufora:
=76(9:) ?,
&,,+EE-
&/'(
!-@A()
,@7, "3(3(

,@7, "393&(
#2

Uzyskany uchwyt moe posuy do uaktywnienia wybranego shadera:


=76(9:) ?,
&,,+EE(&/'(
!,@7, 93&(
#2

Wywoanie metody " ma analogiczne dziaanie do ustawienia kilku stanw


fazy tekstury. Przekazanie wartoci ',-- do metody " powoduje dezaktywacj pixel shadera. Jeeli nie ustawiono aktywnego pixel shadera, to mona w zwyky
sposb korzysta ze stanw faz tekstur. W rzeczywistoci w przypadku prostych operacji
w dalszym cigu mona wykorzystywa stany tekstury. Przykadowo, domylnie pierwsza
faza tekstury moduluje kolor rozproszenia. Nie ma potrzeby dokonywania implementacji
tej operacji wewntrz shadera, mona pozwoli na wykonanie tej czynnoci w ramach
standardowej operacji czenia.

Bardzo prosta aplikacja


wykorzystujca mechanizm pixel shader
Niestety, zanim przejd do naprawd interesujcych aplikacji wykorzystujcych pixel
shadery, najpierw musz omwi kilka aplikacji wykorzystujcych mechanizmy vertex
shader. Wikszo z ciekawszych zastosowa pixel shaderw wymaga uycia mechanizmw vertex shader do dostarczenia danych do pixel shadera. W tym rozdziale skoncentruj si na prostej aplikacji, ktra przedstawia niektre podstawowe pojcia. Do
praktycznych zastosowa wykorzystamy pixel shadery, poczwszy od rozdziau 29.
W tym rozdziale wykorzystamy prosty vertex shader do obliczenia wartoci kierunkowego owietlenia dla kadego wierzchoka. Wspczynniki owietlenia s interpolowane
na powierzchni prostej paszczyzny. Pixel shader czy tekstur z wartoci owietlenia,
ale wykorzystuje take inn tekstur w celu zdefiniowania obszaru tekstury odbijajcego
mniej wiata. Jest to uproszczona wersja owietlenia na poziomie pikseli. Owietlenie
na poziomie wierzchokw oblicza vertex shader, ale to pixel shader wykonuje ostatni etap
oblicze, okrelajc warto owietlenia dla kadego piksela. Efekt dziaania aplikacji
pokazano na rysunku 16.4.
Aby zrozumie, jakie dane trafiaj do pixel shadera, naley najpierw przeanalizowa
vertex shader.

Rozdzia 16.

Mechanizmy pixel shader

273

Rysunek 16.4.
Bardzo prosta
aplikacja
wykorzystujca
pixel shader

Proste owietlenie
za pomoc mechanizmu vertex shader
Wykonywanie oblicze owietlenia za pomoc vertex shaderw szczegowo opisano
w rozdziale 24., zatem w tym rozdziale nie bd zagbia si w teori. Pokazany tu przykad to niezwykle prosty vertex shader obliczajcy iloczyn skalarny wektora owietlenia
oraz wektora normalnego wierzchoka. W mojej implementacji vertex shader jest wykorzystany nieco na si, jedynie po to, aby pokaza, w jaki sposb naley przekazywa
dane do pixel shadera,. W kolejnych rozdziaach zaprezentuj lepsze przykady, natomiast
przykad pokazany w tym rozdziale ma na celu pokazanie moliwoci wzajemnej interakcji pomidzy shaderami. Poniszy kod shadera pochodzi z pliku PixelSetup.vsh:
  

Wyprowadzimy przeksztacone pozycje. W adnym stopniu nie ma to wpywu na pixel


shader:
 / '  
 /   
 / 1  
 / '  

Obliczamy iloczyn skalarny normalnej wierzchoka oraz wektora owietlenia dla wiata kierunkowego. Warto iloczynu skalarnego to kosinus kta pomidzy dwoma wektorami. W tym kontekcie iloczyn skalarny wykorzystywany jest do okrelenia stopnia
odbicia wiata od powierzchni w prostym modelu owietlenia rozpraszajcego. Wektor
owietlenia przekazywany jest do vertex shadera jako .. Negujemy go, aby wykona
przeksztacenie na wektor wierzchoek owietlenie. Wynik zapisywany jest do rejestru koloru zwierciadlanego  . Temu rejestrowi w mechanizmie pixel shader odpowiada wejciowy rejestr koloru
:

274

Cz IV

Mechanizmy shader

 ,  $

Rejestr staych / przechowuje warto owietlenia otoczenia. Przesyamy t warto


do  (
to pixel shader). To wanie w tym miejscu zastosowaem shader troch na
si. Moglibymy si sprzecza, czy owietlenie kierunkowe i owietlenie otoczenia
mona byo doda wewntrz shadera. Mona by rwnie dyskutowa, ktre dane umieci
i z ktrych rejestrw skorzysta. Pamitajmy, e celem tej aplikacji jest zaprezentowanie
moliwoci, nie za poprawnej techniki owietlenia:
 , F

Na koniec przesyamy wsprzdne tekstury (


0) do wyjciowych rejestrw tekstury.
Dziki temu pixel shader bdzie mg prawidowo korzysta z tekstury:
 ) G

Zatem vertex shader wykonuje czynnoci konfiguracyjne, przesyajc dwie wartoci


koloru oraz zbir wsprzdnych tekstury do pixel shadera. To dziaanie zaprezentowano
na rysunku 16.5.
Rysunek 16.5.
Konfiguracja
parametrw pixel
shadera przez
vertex shader

Ostatnia operacja jest przetwarzana wewntrz mechanizmu pixel shader.

Proste operacje czenia


wewntrz pixel shadera
Tekstura fazy 0 zawiera tekstur, ktra suy dwm celom. Kana koloru definiuje kolory
obiektu, natomiast kana alfa decyduje o tym, jak dobrze wybrany piksel odbija wiato
kierunkowe. Pamitajmy, e nie jest to najlepszy z moliwych modeli owietlenia. Kanay
koloru oraz kana alfa tekstury pokazano na rysunku 16.6.
Naley zauway, e kana alfa stanowi wygodne miejsce, gdzie mona przechowywa
wartoci, ktre nie zawsze s widoczne, ale s potrzebne do oblicze. Jeeli jawnie nie
wykorzystujemy kanau alfa dla obiektw przezroczystych, moemy wykorzysta go do

Rozdzia 16.

Mechanizmy pixel shader

275

Rysunek 16.6.
Kanay koloru i alfa
dla tekstury

innych celw. W naszym przypadku wykorzystuj kana alfa do przechowywania 8-bitowego wspczynnika skalowania dla wartoci owietlenia kierunkowego. Poniszy kod
shadera znajduje si w pliku Simple.psh. Pierwszy wiersz informuje asembler shadera,
ktr wersj shadera wykorzystujemy:
  

W pierwszym wierszu adujemy warto tekstury do pixel shadera. Kod ten moemy
interpretowa nastpujco: warto wsprzdnej tekstury w rejestrze  wykorzystujemy
jako dan wejciow. Ten sam rejestr  wykorzystujemy take do umieszczenia w nim
wartoci koloru wybranego piksela na podstawie wsprzdnych tekstury interpolowanych z wierzchokw:
&' &

W nastpnym wierszu przeprowadzamy zasadnicze dziaania. Instrukcja mad powoduje


pomnoenie interpolowanej wartoci owietlenia kierunkowego przez warto wspczynnika skalowania zapisanego w kanale alfa tekstury. Warto owietlenia otoczenia
jest dodawana do poddanej skalowaniu wartoci owietlenia kierunkowego. Oznacza to,
e na powierzchni rwnomiernie dziaa owietlenie otoczenia, natomiast owietlenie
kierunkowe oddziauje z rn intensywnoci dla rnych pikseli. Jest to dosy dziwny
sposb owietlania powierzchni, ale pokazuje dziaanie prostego pixel shadera:

  &  

Po obliczeniu wartoci owietlenia ostateczna warto jest modulowana przez warto


koloru tekstury. Rejestr  jest zarwno rejestrem tymczasowym, jak rejestrem wynikowym. W vertex shaderach rejestry wynikowe s tylko do odczytu. Nie mona ich wykorzysta jako danych wejciowych instrukcji. W przypadku pixel shaderw tak nie jest.
Rejestr  mona wykorzystywa wielokrotnie, ale musimy si upewni, e ostateczna
warto jest t, ktr chcemy przekaza.


 &

Na rysunku 16.7 pokazano powikszenie ostatecznego wyniku dziaania aplikacji. Zwrmy


uwag na to, e ciemniejsza plama odpowiada ksztatowi zdefiniowanemu dla kanau
alfa pokazanemu na rysunku 16.6.
Rysunek 16.7.
Pytki owietlone
wiatem
kierunkowym
o rnym nateniu

276

Cz IV

Mechanizmy shader

Shadery s w zasadzie dosy proste. Pozostaje opracowanie aplikacji, ktra czy wszystkie opisane elementy w jedn cao.

Prosta aplikacja
z wykorzystaniem pixel shadera
Wikszo interesujcych dziaa naszej aplikacji wykonuj zaprezentowane wczeniej
shadery. Gwnym zadaniem aplikacji jest dostarczenie do shaderw danych oraz zapewnienie utworzenia waciwych shaderw i uaktywnienie ich w odpowiednim czasie.
W zaprezentowanym niej kodzie pokazuj tylko nowe funkcje. Peny kod rdowy
znajduje si na pycie CD (\Kod\Rozdzial16).
Najpierw rozbudowuj funkcj " 12 3 o sprawdzenie dostpnoci pixel shaderw. Jeeli urzdzenie sprztowe nie obsuguje pixel shaderw, aplikacja siga do
urzdzenia referencyjnego. Jest to dobre do testowania, ale w rzeczywistych aplikacjach
lepiej wyczy technik ni wykorzystywa urzdzenie referencyjne:
H@@: I.)EE/J3!#
B

Pobieramy struktur opisu moliwoci i sprawdzamy, czy karta obsuguje mechanizmy


vertex shader oraz pixel shader, posugujc si makrami opisu wersji. We wszystkich
przykadach w tej ksice wykorzystujemy shadery w wersji 1.1 w celu zmaksymalizowania obsugi sprztowej. Jeeli shadery s dostpne, tworzymy urzdzenie sprztowe
za pomoc funkcji pomocniczej. W innym przypadku tworzymy urzdzenie referencyjne.
Pamitajmy o tym, e urzdzenie referencyjne moe by niezwykle wolne, szczeglnie
w przypadku wolnego procesora gwnego. Jeeli nasz sprzt nie obsuguje shaderw,
moemy czeka nawet kilka sekund na renderowanie ramki. W takim przypadkach naley
zachowa cierpliwo:
,,-./(+ 012
*3,,$45&,-!,,.,./)67*,68.9:) ,,,6;)</6*=.: >01#2
 !01 ;
&'(
;
 ,,;(*;67(?@A!# >>
01 /'(
;
 ,,/(*;67(?@A!##
B
 !8.?:6,!9&3
1/
&.3@!*3& ,,,6;)</6*=.:
,,-76.)6*=.7,.76*;67)6C/7@-6((?A5###

&
 8.:(62
D

B
 !8.?:6,!9&3
1/
&.3@!*3& ,,,6;)</6*768
,,-76.)6*(@8).76*;67)6C/7@-6((?A5###

&
 8.:(62
D

Metody 4  2, oraz ,3 5 "66 wykonuj podstawowe


dziaania konfiguracji urzdzenia oraz utworzenia bufora dla czterech punktw prostokta. Funkcji tych nie pokazano w tym rozdziale. Nie dzieje si w nich nic nowego:

Rozdzia 16.

Mechanizmy pixel shader

277

I 
9
11!#2
 !8.?:6,!9&3
1H
/111!###

&
 8.:(62

Metoda ,3 6 tworzy zarwno mechanizm vertex shader, jak i pixel shader.
Jeeli wykonanie tej metody nie powiedzie si, bdzie to wskazywao na moliwy bd
syntaktyczny w kodzie shadera. Jeeli shader jest poprawny, wykonanie funkcji zawsze
powinno zakoczy si pomylnie, ze wzgldu na alternatywne wykorzystanie urzdzenia
referencyjnego. Jeeli zdezaktywujemy wykorzystanie urzdzenia referencyjnego, wywoanie funkcji moe si nie powie w przypadku, gdy sprzt nie obsuguje shaderw:
 !8.?:6,!9&3
1(
!###

&
 8.:(62

Ponisza tekstura to ta, ktr pokazano na rysunku 16.5. Zarwno kolor, jak i dane dotyczce odbicia zapisano w pojedynczej teksturze:
 !8.?:6,!,,C-
&)'&
8
8!*39
11,,
K LLLL) K
>*3)&
###

&
 8.:(62

&
 )7962
D

Funkcja ,3 6 tworzy shadery wykorzystywane w czasie renderowania sceny.


Poniszy kod jest podobny do kodu prezentowanego w poprzednich rozdziaach:
=76(9:) I.)EE9&3
1(
!#
B
?,,CH
" 3H
(
2
?,,CH
" 3H(
2

Tworzymy vertex shader i wykonujemy asemblacj zgodnie z opisem z poprzedniego


rozdziau. W rzeczywistych implementacjach w przypadku bdw by moe naleaoby
sprawdzi zawarto bufora bdw:
 !8.?:6,!,,C.(
8
8!K LLLL
LL/'(& K
 A9:: >3H
(
 >3H(
###

&
 6*8.?:2
 !8.?:6,!*39
11,,$4-
&;
&'(
!,

!,@7, "#3H
(
$45&H
/&
!#
>*(
I 
 ###

&
 6*8.?:2

Zwalniamy bufor shadera, aby mona go byo wykorzysta ponownie do utworzenia pixel
shadera. Zwalnianie bufora bdw nie jest potrzebne, poniewa jeeli jestemy w tym
miejscu, oznacza to, e bufor bdw nie zosta utworzony:
3H
(
$47!#2

Wywoanie wykorzystane do utworzenia pixel shadera jest dokadnie takie same, jak wywoanie do utworzenia vertex shadera. Asembler wykorzystuje pierwsz instrukcj opisujc wersj w celu uzyskania informacji o typie shadera oraz o sposobie jego asemblacji:

278

Cz IV

Mechanizmy shader

 !8.?:6,!,,C.(
8
8!K LLLL
LL( K
 A9:: >3H
(

>3H(
###

&
 6*8.?:2

Wywoanie metody " jest podobne do wywoania metody #7


, ale w tym przypadku deklaracja nie jest potrzebna. Jeeli operacja powiedzie
si, to w wyniku jej dziaania bdziemy mieli poprawny pixel shader do wykorzystania
w czasie renderingu:
 !8.?:6,!*39
11,,$4-
&/'(
!
!,@7, "#3H
(
$45&H
/&
!#
>*/
&/'(
###

&
 6*8.?:2
3H
(
$47!#2

&
 (*@I2
D

Powysze wiersze odpowiaday za utworzenie shaderw. Przed zakoczeniem aplikacji


lub przed jej odtworzeniem powinnimy zadba o ich usunicie. Sposb usunicia shaderw w funkcji " 3 * pokazano poniej:
H@@: I.)EE/
1@&3
1!#
B

Za pomoc funkcji # oraz " zapewniamy usunicie


shaderw. Moemy utworzy bufory wierzchokw, ktre podlegaj automatycznemu
odtworzeniu w czasie odtwarzania urzdzenia, ale o usunicie i ponowne utworzenie
shaderw musimy zadba samodzielnie:
*39
11,,$4,&;
&'(
!*(
I 
#2
*39
11,,$4,&/'(
!*/
&/'(
#2

&
 )7962
D

Na koniec, funkcja renderujca wykorzystuje shadery do wykonania interesujcych dziaa.


W poniszym kodzie zaoono, e wczeniej poprawnie utworzono shadery:
 I.)EE7
!#
B

Teraz trzeba ustawi vertex shader. W naszej prostej aplikacji moglimy ustawi vertex
shader w czasie tworzenia shadera. W naszym przykadzie jednak umieszczam t instrukcj wewntrz funkcji renderujcej dla lepszego zilustrowania wykonywanych dziaa:
*39
11,,$4(&;
&'(
!*(
I 
#2

Poniszy kod wykonuje animacj kierunku owietlenia. W obliczeniach przyjto, e owietlenie jest zawsze skierowane w d, niezalenie od wartoci animacji. Po zdefiniowaniu
kierunku owietlenia jest on przekazywany do rejestru . shadera. W rozdziale 24. dowiemy si, e takie przyjmowanie sposobu oddziaywania wektora owietlenia na przeksztacenia obiektu jest naiwne (i zazwyczaj niepoprawne), ale dla naszej prostej aplikacji
wystarczy. Jeeli zdecydujemy si na modyfikacj macierzy wiata, uzyskamy nieprawidowe wyniki, ale w tym kontekcie nie jest to takie wane. Moje sowa nabior wikszego
sensu w rozdziale 24:

Rozdzia 16.

Mechanizmy pixel shader

279

& -1 !&#5&)-&!# M  2


,,C;6-)@7 I
(3& ,,C;6-)@7!!-1# $!!-1##
   #2
*39
11,,$4(&;
&'(
-&&! >I
(3& #2

Ustawiamy niewielk skadow wiata otaczajcego. wiato otaczajce jest przekazywane


do vertex shadera, a nastpnie do pixel shadera.
,,C;6-)@7 @&1 !       #2
*39
11,,$4(&;
&'(
-&&!F >@&1 #2

Do shadera trzeba take przekaza poczon macierz. Poszczeglne macierze ustawiono


w funkcji 4  2,:
,,C0.)7?C 0
1(
 *0
1(3& " *0
1 "
*0
171&2
,,C0&
')
!>0
1(
 >0
1(
#2
*39
11,,$4(&;
&'(
-&&! >0
1(
 #2

Ustawiamy tekstur w fazie 0. W tym prostym przypadku tekstur mona byo ustawi
podczas jej adowania, ale dla jasnoci ustawiam jej warto w tym miejscu:
*39
11,,$4(&)'&
! *3)&
#2

Ustawiamy pixel shader. Ten shader wymaga przekazania kilku tekstur wejciowych oraz
wartoci z vertex shadera. Mona by byo wykorzysta pixel shader z innym vertex shaderem i tekstur, ale wyniki mogyby by nieprzewidywalne i prawdopodobnie bdne:
*39
11,,$4(&/'(
!*/
&/'(
#2

Teraz kiedy wykonalimy wszystkie czynnoci przygotowawcze, moemy wykreli siatk.


W naszym przypadku jest to paszczyzna z prost tekstur. Siatka zawiera wsprzdne
tekstury, ktre informuj pixel shader, w jaki sposb naley prbkowa tekstur. Podobnie
jak w przypadku innych poj dotyczcych tekstur, bdne wsprzdne tekstury powoduj uzyskiwanie bdnych wynikw:
*39
11,,$4(&(&
(
! *3/111H

1
1!?67J-=@:6I*(?.)I?##2
*39
11,,$4,
3/
&!,,/)*)7?.A5:6()7?/  #2

Zazwyczaj, jeeli nie wykorzystujemy pixel shadera, dobrym pomysem jest jego wyczenie. W tym przypadku cay czas korzystamy z pixel shadera, ale dodaem ponisz
instrukcj po to, aby podkreli to, jak wane jest wyczanie shadera. Podobnie jak stany
faz tekstur, pixel shader jest stosowany dla kadego piksela do chwili, kiedy zostanie
jawnie zmieniony. Inaczej ni w przypadku stanw faz tekstur, wyczenie shadera jest
znacznie atwiejsze ni osobne wyczanie kadego ze stanw tekstury:
*39
11,,$4(&/'(
!#2
D

Wynik dziaania aplikacji ju pokazano na rysunkach 16.4 i 16.6. Ten przykad jest nieco
sztuczny, a procedury owietlenia nie s najwyszej jakoci, ale ilustruje podstawy tworzenia mechanizmw pixel shader, zasilania ich danymi przez vertex shadery oraz wykorzystywania do oddziaywania na wynik przebiegu renderingu.

280

Cz IV

Mechanizmy shader

Podsumowanie
Nie ma w tym nic dziwnego, jeli czytelnik po lekturze powyszych rozdziau nie czuje
si jeszcze zbyt pewnie, zwaywszy, e prezentowany materia jest nowy. Osobicie
uwaam, e atwiej zrozumie pojcia, kiedy si ich uywa. W tym rozdziale moim zamiarem byo skrtowe omwienie podstawowych poj oraz definicji instrukcji. W dalszych rozdziaach utrwalimy pojcia za pomoc przykadw.
Kolejnych kilka rozdziaw koncentruje si na vertex shaderach. Nauczymy si skadni
oraz wielu poj na tle interesujcych i ciekawych technik. Zaprezentowane techniki
pozwol nam myle w kategoriach ogranicze instrukcji uywanych w shaderach. Do
czasu, kiedy przeanalizujemy pierwszy pixel shader w rozdziale 29., bdziemy do
swobodnie posugiwa si shaderami. Od tego momentu przejcie od vertex shaderw
do pixel shaderw powinno by atwiejsze, ni nam si wydaje. Zatem zapamitajmy
z tego rozdziau tyle, ile si da, ale pamitajmy, e dalsze rozdziay utrwal wiele spord poj poznanych w tym rozdziale. Zanim przejdziemy dalej, sprbujmy podsumowa
poznane pojcia:


Pixel shadery zamieniaj mniej efektywn technologi stanw tekstur,


oferujc model programowalny podobny do vertex shaderw.

Istnieje moliwo jednoczesnego wykorzystania w tej samej aplikacji pixel


shaderw z technologi czenia faz tekstur. W zasadzie pixel shadery powinno
si wykorzystywa do bardziej skomplikowanych operacji, a prostsze przypadki
pozostawi staremu sposobowi.

Cztery wersje pixel shaderw s w rnym stopniu obsugiwane przez rne


rodzaje sprztu. Obecnie najnowsz i oferujc najwiksze moliwoci,
a jednoczenie najmniej rozpowszechnion wersj jest wersja 1.4.
Dowolny sprzt obsugujcy mechanizmy pixel shader obsuguje wersj 1.1.

Pixel shadery dziaaj w podobny sposb jak vertex shadery. Instrukcje zapisuj
i odczytuj dane z i do rejestrw, a nastpnie przekazuj ostateczne wyniki.

W wikszoci rejestrw przechowuje si dane o kolorach. Wyjtek stanowi


rejestry tekstur. Rejestry tekstur przechowuj dane o wsprzdnych tekstur.
W zalenoci od instrukcji mona ich uy jako prbek koloru lub jako danych
wektorowych.

Instrukcje ,  oraz  wykonuj konfiguracj shadera i nie zawieraj si
w oglnej liczbie dozwolonych instrukcji w shaderze.

Instrukcji arytmetycznych mona uy w celu wykonania operacji matematycznych


dotyczcych wartoci kolorw. Zazwyczaj mona uy osobnych instrukcji dla
wartoci opisu kolorw oraz wartoci opisu kanau alfa.

Instrukcje adresowania tekstur oferuj najwiksze moliwoci. Decyduj one


o sposobie interpretowania danych wejciowych opisujcych tekstury. Instrukcji
tych mona uy do zaadowania wartoci opisu kolorw oraz do wykonywania
operacji na macierzach i wektorach na podstawie wsprzdnych tekstur.

Rozdzia 16.

Mechanizmy pixel shader

Modyfikatory mog suy do modyfikowania instrukcji, mieszania


rejestrw wejciowych oraz tworzenia masek dla rejestrw wynikowych.
Dziki modyfikatorom moliwe jest wykonywanie wikszej liczby dziaa,
ktre s liczone jako mniejsza liczba instrukcji.

Pixel shadery podlegaj ostrzejszym ograniczeniom co do liczby instrukcji ni


vertex shadery. Ograniczenia dotycz nie tylko cakowitej liczby instrukcji,
ale take liczby instrukcji okrelonych typw, a czasami poszczeglnych
instrukcji i modyfikatorw.

Dziki analizie moliwoci urzdzenia mona sprawdzi, czy sprzt obsuguje


mechanizmy pixel shadery.

Pixel shadery, podobnie jak vertex shadery naley podda asemblacji, utworzy
i ustawi. Podczas tworzenia pixel shaderw deklaracje nie s potrzebne.

Dla celw testowania zawsze mona skorzysta z urzdzenia referencyjnego,


ale naley pamita, e uzyskana wydajno bdzie bardzo niska.

281

You might also like