Wykład 5. Rendering (2) Geometria

Podobne dokumenty
Wykład 4. Rendering (1) Informacje podstawowe

RENDERING W CZASIE RZECZYWISTYM. Michał Radziszewski

Wprowadzenie. Artur Staszczyk Bartłomiej Filipek

8 Przygotował: mgr inż. Maciej Lasota

Grafika trójwymiarowa

1. Prymitywy graficzne

Modelowanie i wstęp do druku 3D Wykład 1. Robert Banasiak

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

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku

Plan wykładu. Akcelerator 3D Potok graficzny

Grafika komputerowa i wizualizacja. dr Wojciech Pałubicki

System plików warstwa fizyczna

System plików warstwa fizyczna

System plików warstwa fizyczna

Pliki. Operacje na plikach w Pascalu

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

Grafika Komputerowa Wykład 4. Synteza grafiki 3D. mgr inż. Michał Chwesiuk 1/30

Julia 4D - raytracing

Karty graficzne możemy podzielić na:

Sieciowe Technologie Mobilne. Laboratorium 4

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

Programowanie Procesorów Graficznych

Builder (budowniczy) Cel: Przykład:

Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas

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

Synteza i obróbka obrazu. Modelowanie obiektów 3D

Bartosz Bazyluk OpenGL Programowalny potok renderowania, buforowanie geometrii (VBO, IBO, VAO).

Wykład 12. Animacja postaci

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

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

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

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

Wyświetlanie terenu. Clipmapy geometrii

SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE

System plików warstwa logiczna

RENDERING W CZASIE RZECZYWISTYM. Michał Radziszewski

Programowanie współbieżne i rozproszone

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

DesignCAD 3D Max 24.0 PL

Architektura Procesorów Graficznych

Grafika komputerowa i wizualizacja

Widoki zagnieżdżone, layout. 1. Wprowadzenie Repozytoria danych

LEKCJA TEMAT: Zasada działania komputera.

Zarządzanie pamięcią operacyjną

Wybrane aspekty teorii grafiki komputerowej - dążenie do wizualnego realizmu. Mirosław Głowacki

Koncepcja systemu informatycznego realizującego w środowisku Oracle Spatial proces generalizacji modelu BDOT10 do postaci BDOT50

Wykład 5: Klasy cz. 3

Mikołaj Kania Waldemar Korłub Jakub Krajewski

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

Programowanie obiektowe

Systemy wirtualnej rzeczywistości. Podstawy grafiki 3D

Programowanie na poziomie sprzętu. Programowanie w Windows API

Wprowadzenie do grafiki maszynowej. Wprowadzenie do historii OpenGL

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

OfficeObjects e-forms

Podstawy Programowania C++

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

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Architektura komputerów

Moc płynąca z kart graficznych

Architektura komputerów

Plan. Formularz i jego typy. Tworzenie formularza. Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza

PRZEWODNIK PO PRZEDMIOCIE

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

Programowanie w języku Python. Grażyna Koba

Zaawansowany kurs języka Python

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

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

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Wzorce projektowe. dr inż. Marcin Pietroo

Architektura systemów komputerowych. Przetwarzanie potokowe I

Przykładowa implementacja

Wykład 4. Tablice. Pliki

Architektura i administracja systemów operacyjnych

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

Wprowadzenie do grafiki komputerowej. W. Alda

Część II Wyświetlanie obrazów

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Programowanie gier komputerowych. Tomasz Martyn. Wykład 10. Różności: Cinamatics, Aktorzy kinematyczni, Prefabs, Archetypes

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Windows.

Symulacja samochodu z kamerą stereowizyjną. Krzysztof Sykuła 15 czerwca 2007

Dziedziczenie. Zadanie 1

Wybrane aspekty teorii grafiki komputerowej - dążenie do wizualnego realizmu. Mirosław Głowacki

Interfejsy i klasy wewnętrzne

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

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

Przeciążanie operatorów

Wstęp Budowa Serwlety JSP Podsumowanie. Tomcat. Kotwasiński. 1 grudnia 2008

Struktura systemu operacyjnego. Opracował: mgr Marek Kwiatkowski

Shadery. Artur Staszczyk Bartłomiej Filipek

Animowana grafika 3D. Opracowanie: J. Kęsik.

Działanie i charakterystyka sterownika GE FANUC VersaMaxNano

Wstęp do Programowania 2

Podstawy Programowania 2

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

Transkrypt:

Wykład 5. Rendering (2) Geometria

1. Z ogólnego, niezależnego od implementacji punktu widzenia, dane stanowiące opis geometrii modelu zorganizowane są w skończoną sekwencję (lub grupę sekwencji), którego elementami są wierzchołki (vertices). 2. Wizualizacja (rendering) modelu odbywa się poprzez skierowanie do potoku graficznego sekwnecji wierzchołków reprezentujących model. 3. W aplikacjach graficznych czasu rzeczywistego (np. grach) dąży się do przekazywania danych geometrycznych do potoku graficznego w jak największych paczkach (batches), przy użyciu jak najmniejszej liczby wywołań funkcji API. 4. W szczególności, NIE wykorzystuje się w tym celu implementowanego we wcześniejszych wersjach OpenGLa trybu bezpośredniego:

1. W celu odróżnienia od wierzchołków w sensie matematycznym, wierzchołki definiujące geometrię dla celów renderingu będziemy nazywali wierzchołkami graficznymi lub werteksami. 2. Werteksy są przede wszystkim nośnikami informacji o położeniu tworzących model punktów (zwykle rozważanych właśnie jako wierzchołki siatki trójkątów tworzących powierzchnię modelu, często w układzie współrzędnych modelu). 3. Jednakże, w odróżnieniu od wierzchołków matematycznych, oprócz położenia, werteksy zawierają zwykle dodatkową informację wykorzystywaną przez potok graficzny np. kolor punktu, wektor normalny w punkcie, współrzędne tekstur definiujące odwzorowanie tekstury (lub tekstur) na powierzchnię modelu, etc. 4. Składowe tworzące wierzchołki graficzne określane są jako atrybuty wierzchołków (vertex attributes). 5. Każdy z werteksów danej sekwencji tworzącej model (lub jego część) zdefiniowany jest przez te same atrybuty, np.:

Sekwencja werteksów może być zorganizowana w pamięci (RAM, Video RAM, dysk twardy,...) na kilka sposobów: wszystkie dane (atrybuty) werteksów sekwencji umiejscowione są w jednym buforze (strumieniu) wierzchołków: dane każdego z rodzajów atrybutów werteksów znajdują się w odrębnym buforze (strumieniu): reprezentacje pośrednie (dane poszczególnych atrybutów rozdzielone są pomiędzy 2 lub więcej buforów) Sposób zorganizowania ma znaczenie m.in. w zagadnieniu wydajności operacji odczytu i zapisu danych z/do bufora wierzchołków dokonywanych przez CPU, gdy bufor przechowywany jest w pamięci karty graficznej (Video RAM).

W siatkach trójkątów większość wierzchołków jest współdzielonych przez 2 lub więcej trójkątów: Reprezentowanie siatki trójkątów wyłącznie za pomocą ciągu trójek werteksów definiujących trójkąty skutkowałoby zatem (często wielokrotnym) powielaniem werteksów (a więc wartości ich atrybutów). To, z kolei, pociągałoby nie tylko marnowanie zasobów pamięciowych (w szczególności VRAM), ale także marnowanie przepustowości łącza podczas przesyłania werteksów pomiędzy CPU i GPU. W celu poradzenia sobie z w/w problemem redundancji werteksów wykorzystuje się bufory indeksów:

Przekazywane do potoku graficznego sekwencje danych, które reprezentują wartości atrybutów kolejnych werteksów modelu, są strumieniami bajtów. Deklaracja wierzchołka (vertex declaration, vertex layout) jest wymaganym przez dane API, formalnym sposobem poinformowanie potoku o semantyce (znaczeniu w sensie rodzaju atrybutu) poszczególnych wartości, ich typie oraz ich organizacji. W zależności od API, deklaracja wierzchołka dokonywana jest: albo explicite (w sposób jawny) przy użyciu odpowiednich funkcji API dedykowanych temu celowi, albo implicite (niejawnie) w trakcie formatowania operacji przesłania atrybutów werteksów do karty graficznej. W DirectX mamy do czynienia z jawnym sposobem deklarowania wierzchołka (deklaracja explicite), podczas gdy OpenGL deklaracja wierzchołka uwikłana jest w przygotowanie procesu przesłania danych do karty graficznej (deklaracja implicite).

W D3DX 9 (w D3DX 10 i 11 analogicznie) każdy z atrybutów opisany jest strukturą: Np. deklaracja wierzchołka może mieć postać: Utworzenie interfejsu deklaracji wierzchołka oraz poinformowanie potoku o aktualnej deklaracji odbywa się poprzez wywołanie metod:

W OpenGL organizacja atrybutów werteksów deklarowana jest niejawnie podczas przygotowywania procesu przesyłania danych do karty graficznej. W wersji OpenGL 2.0 (i wcześniejszych) oraz OpenGL ES 1.x wykorzystuje się w tym celu m.in. funkcje glvertexpointer, glcolorpointer, glnormalpointer, gltexcoordpointer, np.: łącznie z funkcjami glenableclientstate(glenum array) aktywującymi odpowiednie tablice (strumienie) atrybutów, np: Począwszy od wersji OpenGL 3.0 oraz OpenGL ES 2.0, w których usunięto stały potok graficzny, odpowiednia deklaracja atrybutów wierzchołków odbywa przy użyciu funkcji glvertexattribpointer.

OpenGL w wersjach 1.1 2.x (OpenGL ES 1.x) udostępnia funkcjonalność indeksowanych tablic wierzchołków: gdzie przesyła strumień werteksów do potoku graficznego. Wadą tablic wierzchołków jest to, że są przechowywane po stronie CPU i w celu renderingu za każdym razem muszą być przesyłane do karty graficznej.

Bufory wierzchołków i indeksów stosowane w DirectX nie posiadają wskazanej wady tablic wierzchołków OpenGL, bowiem bufory te mogą egzystować bezpośrednio w pamięci VRAM karty graficznej. 1. W D3DX 9 (podobnie w D3DX 10 i 11) bufory wierzchołków tworzy się za pomocą metody: Analogicznie, bufory indeksów tworzy się przy wykorzystaniu metody CreateIndexBuffer o podobnych parametrach. 2. W celu wypełnienia bufora danymi (ew. odczytu danych) należy otrzymać do niego wskaźnik wywołując metodę Lock (odpowiednio Map w D3DX 10 i 11), a następnie po wypełnieniu bufor odblokować wywołując metodę Unlock (odpowiednio Unmap w D3DX 10 i 11).

W celu renderowania geometrii: bufory wierzchołków (a dokładniej: atrybutów) należy skojarzyć z odpowiednimi strumieniami określonymi w deklaracji wierzchołka (w DX 9 metoda SetStreamSource, w D3DX 10 i 11 metoda IASetVertexBuffers) skojarzyć z potokiem bufor indeksów (w D3DX 9 metoda SetIndices, w D3DX 10 i 11 SetIndexBuffer) poinformować potok o bieżącej deklaracji wierzchołka (w DX 9 metoda SetVertexDeclaration, w D3DX 10 i 11 IASetInputLayout) wywołać polecenie przesłania werteksów do potoku graficznego (w DX 9 metoda DrawIndexedPrimitive, w D3DX 10 i 11 DrawIndexed poprzedzona metodą IASetPrimitiveTopolgy)

W celu realizowania funkcjonalności analogicznej do buforów wierzchołków DirectX, w OpenGL w wersji 1.5 wprowadzono obiekty buforowe (object buffers) umożliwiające przechowywanie tablic wierzchołków i indeksów bezpośrednio w pamięci karty graficznej (Video RAM). tworzenie obiektu buforowego indeksowanej tablicy wierzchołków w celu zmiany zawartości (ew. odczytu) utworzonego obiektu buforowego należy (podobnie jak w DirectX) otrzymać do niego wskaźnik (funkcja glmapbuffer), a następnie bufor odblokować (glunmapbuffer). Funkcja glbuffersubdata pozwala zapisać dane do dowiązanego bufora bez odwzorowywania go w RAM.

Począwszy od wersji OpenGL 3.0 (OpenGL ES 2.0) zrezygnowano z obiektów buforowych tablic wierzchołków znanych z poprzednich wersji i w ich miejsce wprowadzono po prostu obiekty buforów wierzchołków (vertex buffer object - VBO). Obiekty te używa się w niemalże identyczny sposób. Jedna z głównych różnic to ta, że w miejsce wywołań wycofanych funkcji: glenableclientstate i deklaracji atrybutów wierzchołka glvertexpointer, glnormalpointer, etc., wykorzystuje się funkcję ogólną glvertexattribpointer. Dodatkowo wprowadzono nowy typ obiektu wspomagającego wykorzystwanie VBO, noszącego nazwę Vertex Array Object (VAO).

W przypadku multi-platformowego silnika graficznego należy: 1. stworzyć, niezależną od API graficznego, klasę (być może szablonową) reprezentujący bufory wierzchołków/indeksów i działania na nich, której 2. metody interfejsu obudowują (wrapping) implementacje stosowane w konkretnych API graficznych 3. same zaś implementacje dla danego API należy dostarczyć w pliku implementacyjnym Nadto: 4. mając na uwadze wydajność kodu, należy starać się unikać stosowania funkcji wirtualnych (szczególnie wywoływania takich funkcji w wykonywanych wielokrotnie pętlach); koszt wywołania funkcji wirtualnej jest często dużo większy od wywołania zwykłej funkcji z powodu zjawiska chybiania w cash (cash misses) 5. należy pamiętać o tym, że pomimo, iż na danej platformie mogą działać różne API graficzne (np. na PC), to jednak wersja release gry będzie wykorzystywała tylko jedno z nich (dlatego m.in. nie ma sensu aby kod wynikowy zawierał implementacje dla API niewykorzystywanych)