RENDERING W CZASIE RZECZYWISTYM Michał Radziszewski
Plan wykładu Wprowadzenie, literatura Zasady zaliczenia Zakres materiału, zagadnienia Biblioteki graficzne czasu rzeczywistego Historia renderingu na kartach graficznych Procesory główne i graficzne porównanie Przypomnienie podstawowych algorytmów i pojęć związanych z renderingiem
Wprowadzenie Rendering w czasie rzeczywistym polega na generowaniu obrazów na tyle szybko, aby stworzyć wrażenie płynnej animacji i zagwarantować interaktywną współpracę aplikacji z użytkownikiem Aby animacje były postrzegane jako płynne, niezbędne minimum częstotliwości odświeżania to około 30Hz, wartość ta jest stosowana w filmach
Wprowadzenie c.d. W przypadku interaktywnych aplikacji komputerowych częstotliwość odświeżania najlepiej jest synchronizować z monitorem, czyli ok. 60Hz dla większości ekranów LCD Oprócz zagwarantowania wystarczającej częstotliwości odświeżania obrazu należy też zadbać o jego odpowiednią jakość Współcześnie pozwala na to jedynie współpraca procesora głównego i graficznego
Literatura Tomas Akenine-Moller, Eric Haines, Naty Hoffman Real-Time Rendering, 3rd edition, AK Peters 2008 http:// www.realtimerendering.com GPU Gems 1-3 http://developer.nvidia.com/object/g pu_gems_home.html
Literatura OpenGL Specyfikacja standardu OpenGL Mark Segal, Kurt Akeley, The OpenGL Graphics System: A Specification (version 4.3), 2012, http://www.opengl.org/registry/ John Kessenich, Dave Baldwin, Randi Rost, The OpenGL Shading Language, Language Version: 4.3, 2012, http://www.opengl.org/registry/ Dokumentacja rozszerzeń ARB, EXT, NV, ATI, Podręcznik do funkcji API on-line
Literatura OpenGL, c.d. Dave Shreiner OpenGL Programming Guide: The Official Guide to Learning OpenGL, versions 3.0 and 3.1, 7th edition Addison-Wesley Professional 2009 Randi Rost, Bill Licea-Kane OpenGL Shading Language, 3rd edition Addison Wesley Professional 2009
Literatura OpenGL, c.d. Richard S. Wright, Nicholas Haemel, Graham Sellers OpenGL SuperBible, 5th edition Addison-Wesley Professional 2010 Aaftab Munshi, Dan Ginsburg, Dave Shreiner OpenGL ES 2.0 Programming Guide Addison-Wesley Professional 2008
Literatura OpenGL, c.d. David Wolff OpenGL 4.0 Shading Language Cookbook Packt Publishing 2011 Patrick Cozzi, Christophe Riccio OpenGL Insights CRC Press 2012
Literatura CPU vs. GPU Victor W. Lee i inni Debunking the 100X GPU vs. CPU Myth: An Evaluation of Throughput Computing on CPU and GPU International Symposium on Computer Architecture 2010 http://pcl.intelresearch.net/publications/publications.htm
Zasady zaliczenia Wykonywanie zadań na ćwiczeniach, aktywność Przygotowanie i przedstawienie projektu na zajęciach Proponowane tematy na następnych slajdach Można tez zdecydować się na własny temat, związany z renderingiem Max. jedna nieusprawiedliwiona nieobecność
Laboratorium ćwiczenia Na pierwszych zajęciach Uruchomienie aplikacji OpenGL, sprawdzenie/wybór wersji, obsługa rozszerzeń Rendering prostej geometrii przy użyciu programów wierzchołków i fragmentów Teksturowanie Potem: implementacja i testowanie technik poznanych na wykładach
Projekty Zajęcia będą prowadzone na podstawie biblioteki OpenGL Projekt można też wykonać przy pomocy biblioteki DirectX, trzeba będzie się wtedy nauczyć jej obsługi we własnym zakresie Projekty będą odbierane w styczniu Program, demonstracja i omówienie działania 10-15 minutowa prezentacja
Projekty c.d. Projekty są dwuosobowe, jedna grupa może liczyć trzy osoby, jednak projekt powinien być wtedy nieco bardziej ambitny
Tematy projektów Woda: symulacja fal, rendering powierzchni, załamanie, odbicie, kaustyki, dyspersja, mapowanie środowiskowe Dym, mgła: systemy cząsteczkowe, obiekty półprzezroczyste, ruch cząsteczek, ich interakcja z otoczeniem
Tematy projektów c.d. Grafika 2D wspierana sprzętowo: zapoznanie się z rozszerzeniem GL_NV_PATH_RENDERING i wykonanie na jego podstawie prostego edytora Poziomy szczegółowości: (ang. LoD) podmiana siatki, automatyczne upraszczanie siatki, rendering w oparciu o tzw. krzyżaki i billboardy
Tematy projektów c.d. Globalne oświetlenie: technika SSAO (Screen Space Ambient Occlusion) uwypuklenie kształtu obiektów nieoświetlonych bezpośrednio, postprocessing Cienie na dużych obszarach: technika Cascaded Shadow Maps, zastosowanie kilku map cienia do obszarów o wykładniczo rosnących rozmiarach
Tematy projektów c.d. System pogody: symulacja nieba w zależności od pory dnia wschody i zachody słońca, kolor nieba, rendering chmur Dynamiczny wybór rozdzielczości i ładowanie tekstur na GPU w zależności od rozmiaru obiektu na ekranie i gęstości mapowania tekstury
Zakres materiału Tworzenie syntetycznych obrazów z interesującymi efektami wizualnymi Użycie programowalnych procesorów graficznych, Konieczne ze względu na wydajność Zastosowanie przede wszystkim gry komputerowe Też aplikacje CAD, ale tam na ogół ważniejsza jest precyzja niż wygląd
Zagadnienia Lokalne modele oświetlenia: Phong, Cook-Torrance, Ashikhmin-Shirley Techniki mapowania nierówności i przemieszczeń Rendering obiektów półprzeźroczystych Metoda opóźnionego cieniowania (deferred shading) Mapy cienia techniki: podstawowa, PCF i VSM, dla świateł punktowych i kierunkowych
Zagadnienia c.d. Post-processing, HDR i tone mapping Filtrowanie tekstur Techniki antyaliasingu geometrii Wprowadzenie do programów geometrii Wprowadzenie do programowalnej teselacji Tekstury do odczytu i zapisu Półprzeźroczystość jeszcze raz
Zagadnienia c.d. Omówienie metody: skinning for animation Omówienie metody: clipmap rendering Alternatywy dla renderingu przy pomocy rasteryzacji różne warianty śledzenia promieni
Biblioteki graficzne czasu rzeczywistego Kilkanaście lat temu grafika czasu rzeczywistego była generowana na procesorze głównym, przy pomocy renderera napisanego od zera Wolfenstein, Doom, Quake, Wszystkie współczesne aplikacje tego typu wymagają kart graficznych Biblioteki graficzne zapewniają dostęp do funkcjonalności kart graficznych różnych producentów, oferując podstawowe procedury renderingu
Biblioteki graficzne czasu rzeczywistego c.d.
Biblioteki graficzne czasu rzeczywistego c.d. Biblioteki te skupiają się tylko na jednym algorytmie renderingu rasteryzacji Obecnie żaden inny algorytm (np. śledzenie promieni) w czasie rzeczywistym nie jest w stanie stworzyć obrazu o lepszej jakości Najczęściej stosowane biblioteki to OpenGL i DirectX Mają one bardzo podobne możliwości i wydajność Wybór jednej z nich to kwestia zależności od platform
OpenGL Biblioteka niezależna od platformy PC Linux/Windows, Mac, PS3 Opracowana przez SGI na początku lat 90 Obecnie utrzymywana przez konsorcjum Khronos, skupiające wiele różnych firm z branży Powszechne stosowanie rozszerzeń przez producentów kart graficznych Model programowania proceduralny Najlepiej język C albo C++
DirectX Biblioteka własnościowa Microsoftu Z OpenGL em konkuruje jedynie Direct3D Rozwijana od połowy lat 90, powstała kilka lat później niz OpenGL Niedostępna na systemach Linux, MacOS, PS3 i w nowszych wersjach na Windows XP (!) Brak (tylko teoretycznie) możliwości tworzenia rozszerzeń Model programowania obiektowy
Historia renderingu na kartach graficznych Karty graficzne nieprogramowalne OpenGL 1.x, DirectX do wersji 7 Tylko rendering trójkątów z pojedynczą teksturą Tryby łączenia wielu tekstur Sprzętowa transformacja i oświetlenie wierzchołków Programowalne przetwarzanie wierzchołków Rozszerzenia OpenGL 1.x, DirectX 8.x
Historia renderingu na kartach graficznych c.d. Programowalne przetwarzanie fragmentów OpenGL 2.x, DirectX 9.x Możliwość pisania coraz bardziej zaawansowanych programów Nowe formaty tekstur, HDR, rendering do tekstury
Historia renderingu na kartach graficznych c.d. Programowalne przetwarzanie geometrii OpenGL 3.x, DirectX 10.x Operacje na prymitywach Obliczenia na GPU, operacje stałoprzecinkowe
Historia renderingu na kartach graficznych c.d. Programowalna teselacja OpenGL 4.x, DirectX 11 Nowe możliwości programów GPU Zapis i odczyt z tekstury, operacje atomowe Częściowa implementacja funkcji wirtualnych
Procesory główne i graficzne Obecnie procesory te przeznaczone są do różnych zadań Procesor graficzny (GPU) jest procesorem specjalizowanym potrafi pewne zadania wykonać o wiele szybciej niż procesor główny (CPU) GPU nie nadaje się do wszystkiego! Procesor główny potrafi wykonać dowolny algorytm, jednak nie zawsze w optymalnym czasie i przy niewielkim zużyciu energii
Procesory CPU Optymalizowane do szybkiego przetwarzania sekwencyjnego Względnie szybki zegar, ok. 2.5GHz do ok. 3.5GHz Względnie duża ilość pamięci cache (zwykle 2-12MB L3) Binarna kompatybilność wsteczna
Procesory CPU c.d. Posiadają ograniczone możliwości równoległego wykonywania programów Typowo: 2-6 rdzeni, do 12 wątków z HT SIMD 4x albo 8x (AVX)
Procesory CPU c.d. Możliwość zastosowania dużych ilości pamięci, do 8x4GB w przypadku komputerów domowych, do 16x8GB w przypadku tańszych serwerów, nawet ponad 200GB w droższych serwerach Pamięć wirtualna na dysku rozmiar praktycznie nieograniczony, ale bardzo wolna Niestety względnie mała przepustowość pamięci, obecnie sytuacja ulega poprawie, kontrolery wielokanałowe
Procesory CPU c.d. Możliwość łatwego łączenia kilku układów na jednej płycie głównej 2CPU optymalna relacja cena/wydajność 4CPU i więcej też możliwe ale znacznie droższe 2x więcej rdzeni, niemal 2x większa wydajność aplikacji które są dobrze dostosowane do wielowątkowości 2x więcej pamięci o 2x większej przepustowości Niestety nieco większe opóźnienia, NUMA
Procesory CPU c.d.
Procesory GPU Zoptymalizowane do przetwarzania równoległego Taktowane wolniej niż procesory główne ok. 800MHz do 1.5GHz Konieczność rekompilacji programów po przejściu na nowszy GPU
Procesory GPU c.d. Bardzo rozbudowane możliwości przetwarzania równoległego Do 16 rdzeni z SIMD 32x na procesorach NVIDIA (512 jednostek ALU) Do 24 rdzeni z SIMD 16x i VLIW 4x na procesorach ATI/AMD (1536 jednostek ALU)
Procesory GPU c.d. Ze względu na ogromne znaczenie technologii SIMD i VLIW, procesory te są bardzo nieefektywne w przypadku kodu o dużej ilości rozgałęzień warunkowych Posiadają bardzo przydatne jednostki specjalizowane do teksturowania, obliczania funkcji przestępnych, itp. Posiadają sprzętowy dekoder video, niestety bezużyteczny w grach i obliczeniach
Procesory GPU c.d. Względnie mało pamięci cache (mniej niż 1MB) Ograniczona maksymalna pojemność pamięci, ok. 1-2GB na kartach do użytku domowego, 6GB na kartach profesjonalnych (np. Quadro i Tesla) Brak pamięci wirtualnej Bardzo duża przepustowość pamięci, nieco mniejsze opóźnienia niż w przypadku CPU
Procesory GPU c.d. Łączenie kilku kart graficznych technologie SLI (NVIDIA) albo CrossFire (ATI/AMD) 2, 3, albo 4 procesory Konieczność replikacji danych, zwielokrotnienie dostępnych rdzeni, ale tyle samo pamięci Nieefektywna komunikacja pomiędzy różnymi GPU, często algorytmy dobrze zrównoleglone na poziomie logicznym nie działają dobrze w trybie SLI/CrossFire
Procesory GPU c.d.
Podstawy grafiki 3D Modele budowane z wierzchołków Pozycja Normalna, styczne Współrzędne tekstury I wiele innych Wybrane trójki wierzchołków tworzą trójkąty, stanowiące brzeg modelu Najnowsze karty obsługują bardziej złożone powierzchnie (sprzętowa teselacja)
Podstawy grafiki 3D c.d. Wierzchołki są transformowane z przestrzeni obiektu, przez przestrzeń świata i widoku do przestrzeni ekranu przy pomocy macierzy W przestrzeni ekranu wykonywana jest rasteryzacja trójkątów Na ogół liczone jest też oświetlenie i teksturowanie Wymienione powyżej elementy są bardzo podstawowe, obecnie stosuje się o wiele więcej zaawansowanych technik
Programowalne karty graficzne
Programowalne karty graficzne Wierzchołki są przetwarzane przy pomocy jednostki programowalnej, można wykonać na nich dowolne operacje Każdy wierzchołek przetwarzany jest niezależnie od pozostałych jest to ograniczenie, ale umożliwia ono w pełni równoległe ich przetwarzanie Następnie są tworzone, przycinane i rasteryzowane trójkąty, programista ma mocno ograniczoną kontrolę nad tym procesem
Programowalne karty graficzne W OpenGL od wersji 3.2 jest dostępny programowalny procesor geometrii, który operuje jednocześnie na wszystkich wierzchołkach prymitywu (np. trójkąta albo linii) Może on wygenerować albo usunąć wierzchołki Nie jest to możliwe dla procesora wierzchołków Od wersji 4.0 jest dostępny programowalny procesor teselacji Znacznie efektywniejszy przy dodawaniu geometrii
Programowalne karty graficzne Ostatnią w kolejności jednostką programowalną jest procesor fragmentów (nie pikseli!) Operuje on na indywidualnych fragmentach powstałych w wyniku rasteryzacji prymitywów Fragmenty te odpowiadają pikselom w buforze ramki Zanim staną się pikselami przechodzą jeszcze serię konfigurowalnych, ale nie programowalnych operacji Na najnowszych kartach graficznych można, stosując pewne chwyty, zasymulować procesor pikseli, jednak kosztem utraty wydajności
Programowalne karty graficzne Fragmenty obliczone przez procesor fragmentów zanim staną się pikselami poddawane są testom i operacjom: Test głębi Test nożyc Test szablonu Alpha blending Operacje logiczne
Dziękuję za uwagę