PC World
czwartek 4 grudnia 2008
Wydanie: Lipiec 2008

Archiwum

HLSL - programowanie GPU

A A A rozmiar czcionki
Dzisiejsze karty graficzne wyposażone są standardowo w jednostkę obliczeniową, którą programujemy w podobny sposób jak pierwsze komputery. Tworzymy do nich niewielkie programy, zwane shaderami, które sterują pracą GPU - Graphics Processing Unit. Program cieniujący informuje kartę graficzną, jakie operacje mają zostać wykonane na przetwarzanej geometrii, wierzchołkach i pikselach.


Naszym celem jest utworzenie aplikacji, która wyświetli trójwymiarowy imbryk (rys. 1). Wyjątkowość aplikacji będzie polegała na tym, że rzutowanie wierzchołków z przestrzeni 3D na płaski ekran 2D przeprowadzimy za pomocą programowalnego potoku renderowania. Program cieniujący oprócz transformacji wierzchołków będzie im przypisywał ustalony kolor. Gotowy projekt aplikacji znajduje się na płycie CD/DVD PC World.

Dlaczego stosujemy shadery?

Kliknij, aby powiększyćW DirectX 9 możesz wybierać pomiędzy programowalnym i stałym potokiem renderowania.
Funkcja cieniowania pikseli i wierzchołków pojawiła się wraz z ósmą wersją DirectX. Od niedawna, wraz z premierą DirectX 10, jest możliwe także cieniowanie geometrii na poziomie "prymitywów" (primitives). Shadery wprowadzono, ponieważ twórcy aplikacji stale żądali większej elastyczności i swobody w programowaniu kart graficznych. Do 2001 roku programista mógł wykonywać tylko te operacje związane z przetwarzaniem wierzchołków i pikseli, które zostały zaimplementowane w ramach bibliotek DirectX i OpenGL. Te ograniczenia nie pozwalały korzystać wizualnych efektów dziś stosowanych w wielu grach, m.in. wszędobylskiego postrenderingu, dynamicznego oświetlenia czy cieniowania kreskówkowego.

Potok renderowania pracujący na starych zasadach nazywamy stałym (fixed function pipeline), bo pozwala stosować tylko zdefiniowane wcześniej operacje, konfigurowalne w niewielkim zakresie. Obecnie, po wprowadzeniu programowalnego potoku renderowania, to programista jest odpowiedzialny za napisanie kodu, który będzie sterował pracą karty graficznej i tylko od niego zależy, jak będą przetwarzane wierzchołki i piksele. Za pomocą shaderów można przejąć pełną kontrolę nad generowaniem obrazu i mieć całkowity wpływ na kolor każdego wyświetlanego piksela. W DirectX 9 potoki renderowania stały i programowalny są dostępne równolegle. Tworząc aplikację, decydujesz, którego z nich chcesz używać. W nowym DirectX 10 korzysta się wyłącznie z potoku programowalnego.

Język HLSL
Na początkowym etapie do tworzenia programów cieniujących stosowano niskopoziomowy język, przypominający do złudzenia asembler. Jednak w miarę zwiększania się możliwości kart graficznych programy cieniujące stawały się coraz większe i bardziej skomplikowane, a w związku z tym mniej czytelne i trudniejsze w budowie. Jednak wraz z DirectX 9 wprowadzono wysokopoziomowy język cieniowania zwany w skrócie HLSL (High Level Shading Language). Jest bardzo podobny do popularnego C++, a stosowanie go ma cztery podstawowe zalety. Zwiększa produktywność - tworzenie programów jest prostsze i odbywa się szybciej, wiec można poświęcić więcej uwagi implementowanemu algorytmowi, zamiast skupiać się na osiągnięciu poprawnej pracy shadera. HLSL to także większa czytelność kodu, który wygląda na bardziej "ludzki". Shadery są automatycznie łatwiejsze do modyfikacji i debugowania. Kompilator HLSL przeważnie generuje bardziej efektywny kod niż napisany w całości za pomocą asemblera. Obecnie w Internecie można znaleźć wiele narzędzi wspomagających tworzenie shaderów - jednym z lepszych jest ATI RenderMonkey.


Jednostka Vertex Shader


Zadaniem jednostki Vertex Shader jest przetwarzanie informacji opisujących wierzchołki i manipulowanie nimi. Dla każdego wierzchołka wykonywany jest ten sam program cieniujący, co oznacza, że każdy wierzchołek jest przetwarzany w identyczny sposób aż do momentu, gdy shader zostanie wymieniony na inny.

Jednostka cieniująca otrzymuje dane od aplikacji, ale musi znać ich format, aby móc je poprawnie odczytać. Wierzchołki najczęściej są przesyłane za pośrednictwem buforów wierzchołków, które można umieszczać w pamięci systemowej lub wideo. Natomiast zmienne pomocnicze w postaci wektorów, wartości skalarnych, stałych i macierzy są dostarczane do programu cieniującego za pomocą tablicy stałych. Wszystkie dane trafiają do rejestrów jednostki cieniującej, które na poziomie języka HLSL zostają przed użytkownikiem ukryte. Możesz jednak do nich sięgnąć, jeżeli zdecydujesz się na stosowanie wstawek asemblerowych. Piszesz wówczas niskopoziomowy kod, operując bezpośrednio na rejestrach.

Jednostka Vertex Shader transformuje wierzchołek z trójwymiarowego układu współrzędnych do znormalizowanego dwuwymiarowego układu współrzędnych urządzenia. Współrzędne wierzchołka zostają przekształcone z postaci (X, Y, Z) na postać (X, Y), gdzie wartość nowych współrzędnych leży w przedziale <-1, 1>. Na kolejnym etapie potoku renderowania - już po wyjściu z jednostki cieniowania - współrzędne zostaną zmapowane na rozdzielczość okna widoku, pokrywającego najczęściej cały ekran. Obcięta współrzędna Z zostaje odwzorowana na przedział <0, 1> i służy m.in. do określenia widoczności pikseli i obliczenia zamglenia w wypadku zastosowania mgły pikselowej. Następnie zostaje przeniesiona do fizycznego przedziału bufora głębokości i zapisana w pamięci karty graficznej.

Wierzchołek może mieć wiele właściwości - pozycję, kolor, wektor normalny, współrzędne tekstury, wagi mieszania i jeszcze kilka innych. Wszystkie te informacje możesz ładować do jednostki cieniującej, modyfikować, łączyć, a nawet obliczać na nowo. Jedyną wymaganą właściwością wierzchołka, która bezwzględnie musi zostać wysłana, jest pozycja w przestrzeni 3D. Reszta właściwości jest opcjonalna. Jako informacje wyjściowe jednostka cieniująca zwraca pozycję, kolor wierzchołka, stopień zamglenia, rozmiar punktu i współrzędne tekstury. Oczywiście, podobnie jak na wejściu, jedyną obowiązkową informacją jest pozycja.

W naszej aplikacji do jednostki cieniującej będziemy ładować położenie wierzchołka w przestrzeni 3D, a zwracać jego pozycję po rzutowaniu oraz kolor.

Co musisz wiedzieć?
Przygotowując ten artykuł, założyliśmy, że masz odpowiednie narzędzia i odrobinę wiedzy z zakresu tworzenia aplikacji 3D. Główne wymagania to podstawowa umiejętność programowania w języku C++, ogólna wiedza na temat grafiki 3D oraz doświadczenie w programowaniu z wykorzystaniem biblioteki DirectX Graphics. Przyda się także znajomość podstaw języka HLSL, który wykorzystamy do tworzenia programu cieniującego wierzchołki. Poza tym powinieneś się zaopatrzyć w takie narzędzia, jak DirectX SDK 9 i Visual Studio 2005. Znajdziesz je na oficjalnej stronie microsoft.com.

Wystaw ocenę: 
 Średnia ocena: 
(Głosów: )

Komentarze

Redakcja PC World nie ponosi odpowiedzialności za wypowiedzi Internautów opublikowane na stronach serwisu oraz zastrzega sobie prawo do redagowania, skracania bądź usuwania komentarzy zawierających treści zabronione przez prawo, uznawane za obraźliwie lub naruszające zasady współżycia społecznego. Osoby zamieszczające wypowiedzi naruszające prawo lub prawem chronione dobra osób trzecich mogą ponieść z tego tytułu odpowiedzialność karną lub cywilną.

Ten artykuł nie ma jeszcze żadnych komentarzy. Twój może być pierwszy...




wyżej niżej

POPULARNE TAGI

wyżej niżej

MULTIMEDIA



IDG
© copyright 1999-2008 IDG Poland SA
04-204 Warszawa ul. Jordanowska 12
tel. (+48 22) 321 78 00  fax (+48 22) 321 78 88