Bartłomiej Filipek www.ii.uj.edu.pl/~filipek



Podobne dokumenty
Shadery. Artur Staszczyk Bartłomiej Filipek

Wprowadzenie. Artur Staszczyk Bartłomiej Filipek

Potok graficzny i shadery. Hubert Rutkowski

Plan wykładu. Akcelerator 3D Potok graficzny

Programowanie Procesorów Graficznych

1 Temat: Vertex Shader

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

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

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

Biblioteka OpenGL: Wprowadzenie

Mobilne aplikacje multimedialne. OpenGL

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

Informacje i porady dotyczące pisania shaderów.

Implementacja sieci neuronowych na karcie graficznej. Waldemar Pawlaszek

OpenGL Światło (cieniowanie)

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

3 Przygotował: mgr inż. Maciej Lasota

Grafika Komputerowa Wykład 6. Teksturowanie. mgr inż. Michał Chwesiuk 1/23

Wprowadzenie do WebGL

Karty graficzne możemy podzielić na:

OpenGL Światło (cieniowanie)

GRAFIKA KOMPUTEROWA. Rozwiązania sprzętowe i programowe. Przyspieszanie sprzętowe. Synteza i obróbka obrazu

Grafika 3D na przykładzie XNA 3.1

Przegląd architektury PlayStation 3

Wstęp Podstawy Pierwszy program Definiowanie sceny 3D Przekształcenia geometryczne... 47

Wprowadzenie do QT OpenGL

Karta graficzna karta rozszerzeo odpowiedzialna generowanie sygnału graficznego dla ekranu monitora. Podstawowym zadaniem karty graficznej jest

Grafika Komputerowa Wykład 5. Potok Renderowania Oświetlenie. mgr inż. Michał Chwesiuk 1/38

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

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

Bartosz Bazyluk OpenGL Współczesne podejście do programowania grafiki Część II: Programy cieniujące (shadery)

Nowoczesna OpenGL - rendering wielokątów Rendering wielokątów w kontekście biblioteki SFML

Organizacja pamięci w procesorach graficznych

OpenGL - tekstury Mapowanie tekstur

Wykład 4. Rendering (1) Informacje podstawowe

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Przyspieszanie sprzętowe

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

Szablony funkcji i szablony klas

RENDERING W CZASIE RZECZYWISTYM. Michał Radziszewski

OpenGL - Open Graphics Library. Programowanie grafiki komputerowej. OpenGL 3.0. OpenGL - Architektura (1)

Systemy graficzne. dr inż. Mariusz Szwoch

OpenGL teksturowanie

Komponowanie shaderów w X3D

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Julia 4D - raytracing

dr inż. Jacek Dąbrowski, KSG

Analiza moż liwości i porównanie nowych ję zyków do programowania grafiki

która metoda jest najlepsza

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

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

Ćwiczenie 4 - Podstawy materiałów i tekstur. Renderowanie obrazu i animacji

MonoGame. Wieloplatformowe gry w C# Mateusz Cicheński

Zadanie 1. Ściana. 1. Potrzebne zmienne w dołączonym do zadania kodzie źródłowym

Referencje do zmiennych i obiektów

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

Intro 4kb. sphere tracing. Maciej Matyka (maq / floppy) Dla koła naukowego Voxel

Klient poczty elektronicznej - Thunderbird

Grafika komputerowa i wizualizacja

Podłączanie bibliotek Zapis danych do pliku graficznego Generowanie promienia pierwotnego Import sceny z pliku Algorytm ray tracingu

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS

Idź do. Spis treści Przykładowy rozdział Skorowidz. Katalog książek. Katalog online Zamów drukowany katalog. Twój koszyk.

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

Tworzenie prezentacji w MS PowerPoint

PORÓWNANIE WYDAJNOŚCI JĘZYKÓW CIENIOWANIA CG I HLSL

C++ Przeładowanie operatorów i wzorce w klasach

Pisząc okienkowy program w Matlabie wykorzystujemy gotowe obiekty graficzne, lub możemy tworzyć własne obiekty dziedzicząc już zdefiniowane.

Grafika komputerowa. Grafika komputerowa. Grafika komputerowa

Architektura Procesorów Graficznych

Efektywna analiza składniowa GBK

Wyświetlanie terenu. Clipmapy geometrii

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

Materiały. Dorota Smorawa

Wykład 9: Metody wirtualne i polimorfizm

Wykład 8: klasy cz. 4

Programowanie gier 3D w HTML5. Andrzej P.Urbański Politechnika Poznańska

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

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

Architektura Komputerów

Wstęp do poradnika metodycznego Przykładowy rozkład materiału 13 I rok nauczania...13 II rok nauczania...13 Rozkład materiału:...

Podręczna pomoc Microsoft Power Point 2007

Podstawy Programowania Obiektowego

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 3. Instrukcje wyboru

glwindowpos2d void DrawString (GLint x, GLint y, char *string) { glwindowpos2i (x,y); int len = strlen (string); for (int i = 0; i < len; i++)

OpenGL oświetlenie. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska

Rodzaje plików. Podstawowe definicje.

Karta graficzna. Karta graficzna przyjmuje. rozszerzeń montowanej w magistrali wejścia/wyjścia na płycie głównej. Opcjonalnie układ graficzny

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

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

Co to jest OpenGL? Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5. OpenGL - Achitektura. OpenGL - zalety. olas@icis.pcz.

DesignCAD 3D Max 24.0 PL

Laboratorium grafiki komputerowej i animacji. Ćwiczenie V - Biblioteka OpenGL - oświetlenie sceny

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

PRZEWODNIK PO PRZEDMIOCIE

programowanie w oparciu o platformę netbeans w praktyce

Dowiedz się, jak tworzyć zapierające dech w piersiach gry 3D i efektowne, trójwymiarowe wizualizacje!

GPGPU General-Purpose computing on the GPU. Piotr Stańczyk

Synteza i obróbka obrazu. Tekstury. Opracowanie: dr inż. Grzegorz Szwoch Politechnika Gdańska Katedra Systemów Multimedialnych

Transkrypt:

Bartłomiej Filipek www.ii.uj.edu.pl/~filipek

Nasz Cel Prehistoria krótki wstęp Nowa era! Vertex Shaders Fragment Shaders Podstawy GLSL Obsługa GLSL z API OpenGL Dodajmy parę efektów! Podsumowanie Dodatkowe materiały

OpenGL SuperBible, 4th edition, www.lighthouse.com www.opengl.org/sdk http://www.typhoonlabs.com/ Prezentacja i przykłady są dostępna pod adresem: www.ii.uj.edu.pl/~filipek/tutorials

Projekt: Start

Proste oświetlenie per-pixel Teksturowanie i mieszanie kolorów animacja wykonywana na shaderze (oparta na czasie) Maskowanie kolorów tworzenie dziur w obiektach Inne dodatki

Projekt: Fixed

Dane o wierzchołkach i atrybuty Transformacje Oświetlenie Obcinanie (clipping) Generacja współrzędnych tekstur oraz ich transformacje rasteryzacja

Dane o wierzchołkach i atrybuty Transformacje Oświetlenie Obcinanie (clipping) Generacja współrzędnych tekstur oraz ich transformacje T&L rasteryzacja

Teksturowanie, łączenie kilku tekstur mgła Operacje na fragmentach jak testy głębi, alpha, blending, etc. Zapisz do bufora ramki gdy fragment zaakceptowany Antyaliasing

Texturing Unit Teksturowanie, łączenie kilku tekstur mgła Operacje na fragmentach jak testy głębi, alpha, blending, etc. Zapisz do bufora ramki gdy fragment zaakceptowany Antyaliasing

glenable(gl_lighting); glactivetexture(gl_texture0); gltexenvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); gldisable(gl_texture_2d); glbindtexture(gl_texture_2d, texfloor); glactivetexture(gl_texture1); gltexenvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD ); gldisable(gl_texture_2d); if (g_renderreflection) { glenable(gl_texture_cube_map); glbindtexture(gl_texture_cube_map, reflectiontex); glenable(gl_texture_gen_s); glenable(gl_texture_gen_t); glenable(gl_texture_gen_r); gltexgeni(gl_s, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); gltexgeni(gl_t, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); gltexgeni(gl_r, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);

Graficy i programiści czuli się ograniczeni przez statyczne i ustalone funkcje wewnętrzne OpenGL a. Aby stworzyć efekty trzeba było się nieźle natrudzić przy ustawianiu kolejnych parametrów stanów wewnętrznych OpenGL a. Tu coś wyłącz tu coś ustaw, etc, etc Brakowało elastyczności dlaczego nie mogę stworzyć czegoś nowego? Moc obliczeniowa kart graficznych jest tak duża, że fixed pipeline był dla nich wąskim gardłem.

Powstały dwie jednostki: vertex i fragment shadery. Verte shader ma na celu wykonać wszelkie operacje na wierzchołku transformacje, ustawianie kolorów, współrzędne tekstur, normalne Fragment shader zastępuje głównie teksturowanie, pokrywanie materiałem obiekty. Od teraz wszystko programujemy, a nie ustawiamy!

Vertex shader Dane o wierzchołkach i atrybuty Obcinanie (clipping) Transformacje Oświetlenie?? Generacja współrzędnych tekstur oraz ich transformacje Pomysły artystów rasteryzacja

Fragment Shader Teksturowanie, łączenie kilku tekstur mgła Pomysły artystów Operacje na fragmentach jak testy głębi, alpha, blending, etc. Zapisz do bufora ramki gdy fragment zaakceptowany Antyaliasing

Pozycja gl_vertex Normalna gl_normal Współrzędne tekstur(y) Kolor gl_color Vertex Shader Obliczenia gl_position gl_frontcolor gl_texcoord[n] Stałe jak gl_modelviewmatrix, gl_lightsource[n], stale od użytkownika

Wykonywane dla każdego wierzchołka, wiec może być wiele shaderów wykonywanych równolegle, dla kilku wierzchołków naraz! Może: Przekształcić wierzchołki z przestrzeni obiektu do przestrzeni obcinania (clip-space) Przekazać kolor, normalne i inne atrybuty do pixel shadera. Obliczyć współrzędne tekstur I wiele innych obliczeń. Minimum to ustawić wartość dla gl_position Obliczone wartości (jak kolor, normale ) są interpolowane i przekazywane do fragment shader a

void main() { gl_position = gl_modelviewprojectionmatrix * gl_vertex; gl_frontcolor = gl_color *2.0 - vec4(0.1, 0.1, 0.1, 0.0); } Gl_ModelViewProjectionMatrix dostajemy od maszyny stanów OpenGL gl_vertex dostajemy jako atrybut podawany w glvertex( ) gl_color jako parametr z glcolor( ) Gl_Position minimum, które trzeba wykonać w shaderze to właśnie ustawić tą wartość. Gl_FrontColor mówi dalszym etapom renderowania o kolorze dla przedniej ściany obiektu

Fragment Shader gl_color gl_texcoord[n] Obliczenia gl_fragcolor Stałe, gl_lightsource[n], stale od użytkownika, etc

void main() { gl_fragcolor = gl_color; gl_fragcolor.g = 1.0; } gl_fragcolor minimum które trzeba wykonać w Pixel shaderze ustawić kolor fragmentu Gl_Color interpolowana wartość pochodząca od gl_frontcolor ustawionej w vertex shaderze

Gdy już zdecydujemy się na użycie jakiegoś shadera to w całości musimy zastąpić dany etap potoku renderowania. Na przykład nie możemy tylko obliczyć pozycji wierzchołka i żądać od OpenGL a aby sam sobie policzył dla tego samego wierzchołka oświetlenie. Lub też obliczyć kolor w pixel shaderze i chcieć aby mgła policzyła się sama.

Język bardzo podobny składniowo do C/C++, dlatego uczy się go bardzo szybko i sprawnie W związku z tym, że jest bardzo specjalizowany głównie skupiono się na łatwości obliczeń, mamy więc do dyspozycji multum funkcji matematycznych. na pewno nie ma umiejętności otwierania i zapisywania do pliku, czy wyrzucania wyjścia na konsole Gotowe klasy/struktury dla wektorów (vec2, vec3, vec4 ) i macierzy (mat2, mat3 ) wraz z wszelkimi operacjami na nich. Wbudowana obsługa czytania z tekstur za pomocą tzw. sampler a Instrukcje warunkowe i pętle, instrukcje break, continue, return Można pisać funkcje, tworzyć struktury. Specjalna instrukcja discard dla fragmentów, powoduje odrzucenie fragmentu i nie zapisanie go do bufora. Oczywiście można się komunikować s shaderami i ustawiać im odpowiednie wartości z głównego naszego programu.

Uniform można ją ustawiać jedynie pomiędzy wywołaniami glbegin/glend innymi słowy: stała dla konkretnego obiektu. Varying gdy ustawimy ją w vertex shaderze to fragment shader otrzyma tą wartość, ale odpowiednio interpolowaną. Np. normal, position, etc Attrib (dla wierzchołków) atrybut dla pojedynczego wierzchołka jak gl_color, gl_normal Const stała na potrzeby wewnętrzne shadera Bez kwalifikatora zmienna zwykła globalna lub lokalna.

VERTEX Shader varying vec4 position; varying vec4 normal; void main() { normal = vec4(gl_normal, 1.0); position = gl_modelviewprojectionmatrix * gl_vertex; PIXEL Shader varying vec4 position; varying vec4 normal; void main() { gl_fragcolor = normal+position; } } gl_position = position; gl_frontcolor = gl_color; Shadery napisane w: OpenGL Shader Designer 1.5 www.typhoonlabs.com

VERTEX Shader varying vec3 position; varying vec3 normal; void main() { normal = gl_normal; vec4 v = gl_modelviewmatrix * gl_vertex; position = v.xyz; gl_position = gl_modelviewprojectionmatrix * gl_vertex; } gl_frontcolor = gl_color;

PIXEL Shader varying vec3 position; varying vec3 normal; void main() { vec3 light = gl_lightsource[0].position.xyz - position; light = normalize(light); vec3 norm = normalize(normal); float lightdiffuse = max(0.0,dot(norm, light)); } gl_fragcolor.rgb = lightdiffuse; gl_fragcolor.a = 1.0 Shadery napisane w: OpenGL Shader Designer 1.5 www.typhoonlabs.com

GLSL Quick Ref ściągawka ze składni i używania. TyphoonLabs tu już trochę więcej na temat języka, bardzo polecam.

Postprocessing (blur, motion blur, glow, etc..) Przeglądarka Fraktali Obliczenia współbieżne NVidia CUDA Fizyka Muzyka generowanie i obróbka dźwięku

void InitShaders() { GLint vertex_shader = glcreateshader(gl_vertex_shader); GLint fragment_shader= glcreateshader(gl_fragment_shader); char *vs = ReadAllTextFromFile("shaders/basic.vert"); char *fs = ReadAllTextFromFile("shaders/basic.frag"); const char * vv = vs; const char * ff = fs; glshadersource(vertex_shader, 1, &vv,null); glshadersource(fragment_shader, 1, &ff,null); glcompileshader(vertex_shader); glcompileshader(fragment_shader);...... }

Glint shader_program = glcreateprogram(); glattachshader(shader_program, vertex_shader); glattachshader(shader_program, fragment_shader); gllinkprogram(shader_program); GLint timeelapsed = glgetuniformlocation(shader_program, "time"); Glint texture = glgetuniformlocation(shader_program, "texture"); glbindtexture(gl_texture_2d, gtexsample); gluniform1i(texture, 0);

gluseprogram(shader_program); gluniform1f(timeelapsed, (float)gtimer->gettime()); glbegin/glend gluseprogram(0);

gluseprogram(0); gldeleteprogram(shader_program);

Jak to wygląda w kodzie? Projekt: Basic_shaders

Co można ciekawego zrobić? Projekt: Start

Pokazaliśmy starocie czyli jak działa mniej więcej statyczny potok renderowania i jakie niesie on ze sobą ograniczenia. Omówiliśmy jednostki vertex i pixel shader. Jak to może być użyte w OpenGL I zrobiliśmy ciekawy projekt. I mam nadzieje, że każdy zrozumiał, że shadery to jest naprawdę potęga.

Wszystko to co napisałem w slajdzie pt. źródła tej prezentacji. Shader Designer (TyphoonLabs) można w tym pisać shadery i jest Open Source GPU Gems 1 książka od Nvidii, udostępniona za darmo na ich stronach. CG i HLSL inne wysoko poziomowe języki cieniowania. Kolorowanie Składni GLSL dla Visual Studio

www.ii.uj.edu.pl/~filipek