1 Temat: Vertex Shader

Podobne dokumenty
Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Plan wykładu. Akcelerator 3D Potok graficzny

Bartłomiej Filipek

Gry Komputerowe Laboratorium 4. Teksturowanie Kolizje obiektów z otoczeniem. mgr inż. Michał Chwesiuk 1/29. Szczecin, r

Smarty PHP. Leksykon kieszonkowy

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Programowanie Procesorów Graficznych

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Shadery. Artur Staszczyk Bartłomiej Filipek

OpenGL : Oświetlenie. mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski. Szczecin, r 1/23

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Karta przedmiotu. Podstawy programowania procesorów graficznych. realizowanego w ramach projektu PO WER

Wstęp do Programowania, laboratorium 02

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Język ludzki kod maszynowy

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Implementacja sieci neuronowych na karcie graficznej. Waldemar Pawlaszek

Potok graficzny i shadery. Hubert Rutkowski

Programowanie gier komputerowych Tomasz Martyn Wykład 6. Materiały informacje podstawowe

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

DesignCAD 3D Max 24.0 PL

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

W dowolnym momencie można zmienić typ wskaźnika.

Wizualne systemy programowania. Wykład 11 Grafika. dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Języki i techniki programowania Ćwiczenia 2

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Temat: Transformacje 3D

Podstawy programowania w języku C++

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Poniżej pokazane są poszczególne etapy, w nawiasach kwadratowych znajdują się nazwy tekstur, które utworzymy w projekcie, a przy strzałkach nazwy

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

1 Podstawy c++ w pigułce.

Programowanie procesorów graficznych GPGPU

Programowanie strukturalne i obiektowe. Funkcje

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import "Fraction.h" #import <stdio.h>

Wprowadzenie. Artur Staszczyk Bartłomiej Filipek

Referencje do zmiennych i obiektów

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

Wstęp do programowania

Informacje i porady dotyczące pisania shaderów.

C++ wprowadzanie zmiennych

Podstawy Programowania

Funkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Programowanie komputerowe. Zajęcia 7

Tworzenie szablonów użytkownika

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wprowadzenie do szablonów szablony funkcji

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Szablony funkcji i szablony klas

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Podstawy Programowania C++

BAZY DANYCH Panel sterujący

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie komputerowe. Zajęcia 4

Wprowadzenie do szablonów szablony funkcji

2 Przygotował: mgr inż. Maciej Lasota

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

GRAFIKA CZASU RZECZYWISTEGO Wstęp do programowania grafiki czasu rzeczywistego.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Przedrostkowa i przyrostkowa inkrementacja i dekrementacja

Szablony funkcji i klas (templates)

Mobilne aplikacje multimedialne. OpenGL

GRAFIKA KOMPUTEROWA. Rozwiązania sprzętowe i programowe. Przyspieszanie sprzętowe. Synteza dźwięku i obrazu

1. Prymitywy graficzne

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Wstęp do programowania. Wykład 1

RENDERING W CZASIE RZECZYWISTYM. Michał Radziszewski

Język C++ zajęcia nr 2

Mapowanie tekstur Mip-mapy (level of detail) Filtrowanie Multiteksturowanie

Wprowadzenie do języka Java

Podstawy programowania skrót z wykładów:

1 Podstawy c++ w pigułce.

Podstawy programowania w języku C

2 Przygotował: mgr inż. Maciej Lasota

Systemy wirtualnej rzeczywistości. Podstawy grafiki 3D

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

C-struktury wykład. Dorota Pylak

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Zmienne, stałe i operatory

Transkrypt:

Instrukcja Architektura procesorów graficznych 1 Temat: Vertex Shader Przygotował: mgr inż. Tomasz Michno 1 Wstęp 1.1 Czym jest shader Shader jest programem (zazwyczaj krótkim), wykonywanym przez kartę graficzną. Nie jest to jednak typowy program (taki jak na przykład programy w języku Pascal, czy C), ponieważ jego zadaniem jest sterowanie częścią potoku graficznego/renderowania (graphics/rendering pipeline). Potok graficzny - najprościej mówiąc, potok, który przetwarza obraz 3D na obraz 2D. W uproszczeniu można go przedstawić następująco: Więcej o potoku renderowania i shaderach: com/node/76 http://developer.nvidia. Wyróżniamy następujące shadery: Vertex shader - służy do wykonania przekształceń na wierzchołku (uruchamiany raz dla każdego wierzchołka), możliwy jest dostęp do współrzędnych wierzchołka, jego koloru i współrzędnych tekstur. Nie jest możliwe tworzenie nowych wierzchołków. Geometry shader - służy do dodawania lub usuwania wierzchołków z siatki wierzchołków; dostępny od DirextX 10 i OpenGL 3.1 Pixel/Fragment Shader - służy do wyliczania koloru pikseli, w DirectX stosowana jest nazwa Pixel Shader, w OpenGL Fragment Shader; pozwala zastosować operacje związane głownie z kolorem obiektów - cieniowanie, oświetlanie, ale również np. mapowanie nierówności Obecnie najczęściej shadery pisane są w jednym z trzech języków: GLSL, HLSL lub Cg (na którym się skupimy). 1

1.2 Podstawy języka Cg Język Cg jest językiem wysokiego poziomu stworzonym przez nvidię przy współpracy Microsoftu (jest kompatybilny z HLSL). Został w dużej mierze oparty o język C - posiada tą samą składnię, instrukcje sterujące i typy danych (zostały dodane też typy przydatne dla programowania shaderów - grafiki). 1.2.1 Podstawowe typy: float - 32-bitowa liczba zmiennoprzecinkowa half - 16-bitowa liczba zmiennoprzecinkowa int - 32-bitowa liczba całkowita fixed - 12-bitowa liczba typu fixed-point bool - wartość boolowska (true, false) sampler* - używane do reprezentacji tekstur tablice-wektory na bazie podstawowych typów - w postaci np. float4 macierze na bazie podstawowych typów - w postaci np. float4x4 uniform - odpowiednik const - informuje, że zmienna nie będzie zmieniana w kodzie shadera struktury - struct - używane podobnie jak w C/C++ 1.2.2 Przykład 1 - ustawienie koloru obiektu Pierwszy przykład Vertex Shadera będzie polegał na zmianie koloru obiektu w kodzie shadera. 1 s t r u c t Vertex 2 { 3 f l o a t 4 p o s i t i o n : POSITION ; 4 f l o a t 4 c o l o r : COLOR0; 5 } ; 6 7 Vertex main ( Vertex IN, uniform f l o a t 4 x 4 ModelViewProj ) 8 { 9 Vertex OUT; 10 IN. c o l o r. x=0.0 f ; 2

11 IN. c o l o r. y=1.0 f ; 12 IN. c o l o r. z =1.0 f ; 13 14 OUT. p o s i t i o n = mul ( ModelViewProj, IN. p o s i t i o n ) ; 15 OUT. c o l o r. xyz = IN. c o l o r. xyz ; 16 17 return OUT; 18 } Listing 1: Kod Shadera Powyżej znajduje się kod jednego z najprostszych shaderów (Listing 1). Jego działanie można zobrazować rysunkiem: Jak widać, kod programu otrzymuje na wejściu Vertex (jego pozycję i kolor) i zwraca również Vertex. Dlatego na początku kodu shadera należy zdefiniować strukturę, która będzie reprezentowała wierzchołek (w naszym kodzie struktura o nazwie Vertex, linie 1-5). Tworzenie struktury odbywa się w identyczny sposób, jak w języku C. Pozycja i kolor powinny być typu float4 (4-elementowy wektor liczb float). Jedyną różnicą, którą można zauważyć są etykiety POSITION i COLOR0, które informują kompilator, która ze zmiennych opisuje pozycję Vertex a, a która kolor. Ich użycie jest niezbędne dla kompilatora, ponieważ w inny sposób nie ma możliwości dowiedzenia się, do jakich rejestrów powinny zostać przypisane konkretne zmienne (podobnie jak w C, zmienne mogą mieć dowolne nazwy). Oprócz tych dwóch zmiennych, w strukturze można umieścić jeszcze inne elementy, które będą służyły do przekazywania danych/instrukcji z programu OpenGL. Następnym krokiem jest utworzenie funkcji main(), która powinna zwracać przetworzony vertex (w naszym przykładzie jest to struktura o nazwie Vertex). Parametrami zazwyczaj są: vertex (Vertex IN) i macierz projekcji (uniform float4x4 ModelViewProj). W kodzie funkcji main powinien znaleźć się kod modyfikujący vertex a. W naszym przykładzie: w linii nr 9 tworzymy zmienną typu Vertex o nazwie OUT, która później zostanie zwrócona jako wynik funkcji - vertex wyjściowy w liniach 10-12 modyfikujemy kolor vertex a (dostęp do pól struktur jest identyczny jak w C) - pole x odpowiada za czerwony, y za zielony i z za niebieski 3

w linii 14 ustawiamy współrzędne vertex a wyjściowego, która musi zostać zawsze pomnożona przez macierz widoku w linii 15 kopiujemy kolor do vertex a wyjściowego - jak widać możliwe jest skopiowanie tylko części pól (np. użycie color.xz skopiowałoby tylko pola x i z). 1 #i n c l u d e <GL/ g l. h> 2 #i n c l u d e <GL/ glu. h> 3 #i n c l u d e <GL/ g l u t. h> 4 5 #i n c l u d e <Cg/ cg. h> 6 #i n c l u d e <Cg/cgGL. h> 7 8 #i n c l u d e <s t d l i b. h> 9 #i n c l u d e <s t d i o. h> 10 11 CGcontext cgcontext ; 12 CGprogram cgprogram ; 13 CGprofile c g V e r t e x P r o f i l e ; 14 CGparameter modelviewmatrix, p o s i t i o n, c o l o r ; 15 16 void i n i t ( ) { 17 18 glenable (GL_DEPTH_TEST) ; 19 20 cgcontext = cgcreatecontext ( ) ; 21 i f ( cgcontext==0){ 22 p r i n t f ( " Nie mozna utworzyc kontekstu Cg! " ) ; 23 e x i t ( 1 ) ; 24 } 25 26 c g V e r t e x P r o f i l e = cgglgetlatestprofile (CG_GL_VERTEX) ; 27 i f ( c g V e r t e x P r o f i l e == CG_PROFILE_UNKNOWN) { 28 p r i n t f ( " Nieznany p r o f i l! " ) ; 29 e x i t ( 1 ) ; 30 } 31 32 cgglsetoptimaloptions ( c g V e r t e x P r o f i l e ) ; 33 34 cgprogram = cgcreateprogramfromfile ( cgcontext, CG_SOURCE, " shader. cg ", c g V e r t e x P r o f i l e, "main", 0) ; 35 36 i f ( cgprogram == 0) 37 { 38 CGerror Error = cggeterror ( ) ; 39 4

40 f p r i n t f ( s t d e r r, "%s \n", cggeterrorstring ( Error ) ) ; 41 e x i t ( 1) ; 42 } 43 44 cgglloadprogram ( cgprogram ) ; 45 p o s i t i o n = cggetnamedparameter ( cgprogram, "IN. p o s i t i o n " ) ; 46 c o l o r = cggetnamedparameter ( cgprogram, "IN. c o l o r " ) ; 47 modelviewmatrix = cggetnamedparameter ( cgprogram, " ModelViewProj" ) ; 48 } 49 50 void d i s p l a y ( ) { 51 g l C l e a r (GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT) ; 52 g l L o a d I d e n t i t y ( ) ; 53 54 glulookat ( 5 0. 0 f, 250.0 f, 845.0 f, 0. 0 f, 0. 0 f, 0. 0 f, 0, 1, 0) ; 55 cgglsetstatematrixparameter ( modelviewmatrix, CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY) ; 56 cgglenableprofile ( c g V e r t e x P r o f i l e ) ; 57 cgglbindprogram ( cgprogram ) ; 58 59 g l C o l o r 3 f ( 1, 1, 0) ; 60 glutsolidcube (250) ; 61 cggldisableprofile ( c g V e r t e x P r o f i l e ) ; 62 63 glutswapbuffers ( ) ; 64 } 65 66 / Pozostala c z e s c programu standardowa... / Listing 2: Kod programu OpenGL (fragmenty) Kod programu OpenGL używającego shaderów tak na prawdę wiele się nie różni od zwykłego programu. Musimy dołączyć nagłówki języka Cg (linie 5 i 6). W liniach 11-14 tworzone są zmienne, które są niezbędne do użycia programu shadera: cgcontext - kontekst urządzenia cgprogram - przechowuje skompilowany program Cg cgvertexprofile - profil VertexShadera - używany w celu jak najlepszej optymalizacji kodu modelviewmatrix, position, color - parametry używane w programie shadera Następnie w liniach 20-32 tworzony jest kontekst i pobierany jest profil (więcej informacji w tutorialu do języka Cg od nvidii). Linia 34 jest bardzo ważna, ponieważ odpowiada za kompilację programu shadera. Jako parametry funkcji cgcreateprogramfromfile podajemy kontekst, flagę CG_SOURCE, ścieżkę do kodu źródłowego programu Cg, profil 5

VertexShadera i nazwę głównej funkcji programu. Jeśli coś się nie powiodło (funkcja zwróciła 0), odczytujemy informacje o błędzie i je wyświetlamy. W linii 44 ładujemy program do pamięci oraz w liniach 45-47 łączymy parametry funkcji main programu Cg ze zmiennymi z programie OpenGL. W celu użycia shadera, w funkcji wyświetlającej ustawiamy macierz widoku (linia 55), włączamy profil VertexShadera (56), bindujemy (wybieramy) program shadera (57) i rysujemy, to co mamy narysować. Później należy wyłączyć profil VertexShadera (linia 61). 1.2.3 Przykład 2 - przekazywanie parametrów z kodu głównego do kodu shader a Przykład pokazuje, w jaki sposób przekazywać parametry do programu Cg. Program będzie spłaszczał sferę, poprzez ustawienie tej samej wartości współrzędnej y dla vertexów znajdujących się wyżej niż ustalona granica. 1 s t r u c t InputVertex 2 { 3 f l o a t 4 p o s i t i o n : POSITION ; 4 f l o a t 4 c o l o r : COLOR0; 5 f l o a t ythreshold ; 6 } ; 7 8 s t r u c t OutputVertex 9 { 10 f l o a t 4 p o s i t i o n : POSITION ; 11 f l o a t 4 c o l o r : COLOR0; 12 } ; 13 14 OutputVertex main ( InputVertex IN, uniform f l o a t 4 x 4 ModelViewProj ) 15 { 16 OutputVertex OUT; 17 18 i f ( IN. p o s i t i o n. y>in. ythreshold ) { 19 IN. p o s i t i o n. y=in. ythreshold ; 20 } 21 22 OUT. p o s i t i o n = mul ( ModelViewProj, IN. p o s i t i o n ) ; 23 24 OUT. c o l o r. xyz = IN. c o l o r. xyz ; 25 26 return OUT; 27 } Listing 3: Kod programu shader a 6

Sam kod programu Cg uległ jedynie niewielkim zmianom. Został wprowadzony podział na strukturę dla vertexów wejściowych (InputVertex) i wyjściowych (OutputVertex). W strukturze InputVertex pojawił się nowy element ythreshold (linia nr 5), przez który będziemy przekazywali graniczną wartość y, powyżej której sfera ma być spłaszczona. W funkcji main, poza zmianą struktur vertexów, została dodana instrukcja if (linie 18-20). Sprawdza ona, czy współrzędna y vertexa jest większa od zmiennej ythreshold, jeśli tak, to ustawia ją na wartość ythreshold (dzięki czemu sfera zostaje spłaszczona). W celu ustawiania parametru ythreshold, należy w programie głównym (dla CPU): stworzyć dodatkową zmienną typu CGparameter (w przykładzie jest to ythresholdvertexshader) połączyć ją z parametrem głównej funkcji programu shader a; Po modyfikacji może to wyglądać tak: 1 p o s i t i o n=cggetnamedparameter ( cgprogram, "IN. p o s i t i o n " ) ; 2 c o l o r=cggetnamedparameter ( cgprogram, "IN. c o l o r " ) ; 3 ythresholdvertexshader=cggetnamedparameter ( cgprogram, "IN. ythreshold " ) ; 4 modelviewmatrix=cggetnamedparameter ( cgprogram, " ModelViewProj" ) ; w funkcji display, po zbindowaniu programu Cg należy ustawić ten parametr na jakąś wartość, np: cgglsetparameter1f(ythresholdvertexshader, 10); (w przykładzie zamiast stałej liczby stosujemy zmienną o nazwie ythreshold, która zmienia swoją wartość w czasie działania programu) Do ustawiania parametrów służy rodzina funkcji cgglsetparameter, najpopularniejsze z nich to: 1 void cgglsetparameter1 { fd }( CGparameter param, 2 TYPE x ) ; 3 4 void cgglsetparameter2 { fd }( CGparameter param, 5 TYPE x, 6 TYPE y ) ; 7 8 void cgglsetparameter3 { fd }( CGparameter param, 7

9 TYPE x, 10 TYPE y, 11 TYPE z ) ; 12 13 void cgglsetparameter4 { fd }( CGparameter param, 14 TYPE x, 15 TYPE y, 16 TYPE z, 17 TYPE w ) ; gdzie: liczba po cgglsetparameter oznacza, ile pól posiada ten parametr (np. dla float3 dajemy 3, dla zwykłego float 1) litera f lub d w nawiasie klamrowym służy do wyboru odpowiedniego typu (wybieramy tylko jedną z nich) - f oznacza float, d double. 1.3 Przydatne linki The Cg Tutorial - http://developer.nvidia.com/node/76 - po prawej stronie znajdują się linki do kolejnych rozdziałów Artykuł w NeHe Productions - http://nehe.gamedev.net/tutorial/ cg_vertex_shader/25002/ (polskie tłumaczenie: http://aklimx.sppieniezno.pl/nehepl/display. php?id=47) 8