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

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

Wprowadzenie do QT OpenGL

Gry Komputerowe - laboratorium 2. Kamera FPP / TPP. mgr inż. Michał Chwesiuk 1/11. Szczecin, r

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

Zaawansowana Grafika Komputerowa

OpenGL : Prymitywy, obsługa klawiatury

Shadery. Artur Staszczyk Bartłomiej Filipek

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

Oświetlenie obiektów 3D

Bartłomiej Filipek

Gry Komputerowe Laboratorium 3. Organizacja obiektów sceny Kolizje obiektów. mgr inż. Michał Chwesiuk 1/20. Szczecin, r

Programowanie Procesorów Graficznych

GRK 4. dr Wojciech Palubicki

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?

1 Temat: Vertex Shader

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

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

Julia 4D - raytracing

Programowanie strukturalne i obiektowe. Funkcje

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

1 DirectX Cell Shading

Model oświetlenia. Radosław Mantiuk. Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny w Szczecinie

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

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

Lab 9 Podstawy Programowania

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Oświetlenie. Modelowanie oświetlenia sceny 3D. Algorytmy cieniowania.

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

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

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.

6 Przygotował: mgr inż. Maciej Lasota

Podstawy obiektowości

Programowanie w Javie 1 Wykład i Ćwiczenia 2 Przegląd podstawowych klas w Javie (elementy programowania obiektowego) Płock, 16 października 2013 r.

Oświetlenie w OpenGL. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 8. Światło otaczajace. Światło rozproszone.

Advance CAD 2016 SP2. W tym dokumencie opisano ulepszenia w Advance CAD Service Pack 2. Co nowego w Advance CAD 2016 SP2

Laboratorium 1. Część I. Podstawy biblioteki graficznej OpenGL.

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Dokąd on zmierza? Przemieszczenie i prędkość jako wektory

Rozdział 4 KLASY, OBIEKTY, METODY

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

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

Plan wykładu. Akcelerator 3D Potok graficzny

1. Prymitywy graficzne

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Programowanie obiektowe - zadania

Zadania z podstaw programowania obiektowego

Co to jest wektor? Jest to obiekt posiadający: moduł (długość), kierunek wraz ze zwrotem.

Podstawy Programowania Obiektowego

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Unity 3D - własny ekran startowy i menu gry

Zad. 3: Układ równań liniowych

Laboratorium 1 - Programowanie proceduralne i obiektowe

PODSTAWY AUTOMATYKI. MATLAB - komputerowe środowisko obliczeń naukowoinżynierskich - podstawowe operacje na liczbach i macierzach.

Informacje i porady dotyczące pisania shaderów.

Zad. 4: Rotacje 2D. 1 Cel ćwiczenia. 2 Program zajęć. 3 Opis zadania programowego

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

OpenGL Światło (cieniowanie)

Grafika komputerowa. Model oświetlenia. emisja światła przez źródła światła. interakcja światła z powierzchnią. absorbcja światła przez sensor

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

Język C, tablice i funkcje (laboratorium)

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Wykonanie w 3ds max dowolnego samochodu

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

Celem tego projektu jest stworzenie

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Języki i techniki programowania Ćwiczenia 2

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

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Instrukcja laboratoryjna nr.4

RENDERING W CZASIE RZECZYWISTYM. Michał Radziszewski

Gry Komputerowe Laboratorium 1. Zajęcia organizacyjne Animacja z uwzględnieniem czasu. mgr inż. Michał Chwesiuk 1/22. Szczecin,

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

Zjawisko widzenia obrazów

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

MATLAB Z3. Rafał Woźniak. Warsaw, Faculty of Economic Sciences, University of Warsaw

Zad. 3: Rotacje 2D. Demonstracja przykładu problemu skończonej reprezentacji binarnej liczb

BIBLIOTEKA NUMPY, CZĘŚĆ 2

Zasoby. Musimy zaimportować zasoby dla gry z Asset Store

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Strumienie, pliki. Sortowanie. Wyjątki.

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

Spis treści. Co nowego w Advance CAD NOWOŚCI... 4 USPRAWNIENIA... 11

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Deklaracja i definicja metod, zwracanie wartości z metod, przekazywania parametrów do metod

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora.

Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik

Laboratorium nr 5: Mnożenie wektorów i macierzy

Układy VLSI Bramki 1.0

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

1 Programowanie w matlabie - skrypty i funkcje

Potok graficzny i shadery. Hubert Rutkowski

Podstawy OpenCL część 2

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

OpenGL Światło (cieniowanie)

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

Programowanie - wykład 4

Transkrypt:

OpenGL : mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski 1/23

Folder z plikami zewnętrznymi (resources) Po odpaleniu przykładowego projektu, nie uruchomi się on poprawnie. Powodem jest brak programów cieniujących. Znajdują się one w plikach shader.vs (vertex shader) oraz shader.fs (fragment shader). Pliki te należy wkleić do zbudowanego projektu, do folderu resources, który należy utworzyć w folderze wskazywanym podczas kompilacji przez środowisko QT. 2/13

Konwertowanie pliku.3ds do.obj Do projektu został dołączony plik bunny.3ds i bunny.blend, który należy skonwertować do formatu.obj i dodać do stworzonego wcześniej folderu resources (wybrać plik 3ds albo blend w zależności od zainstalowanego środowiska). File -> Export -> Wavefront (.obj) 3/13

Konwertowanie pliku.blender do.obj File -> Export -> Wavefront (.obj) 4/13

Wczytanie OBJ Projekt został rozbudowany o możliwość wczytywania plików obj. Aby wczytać plik należy odpowiednio użyć funkcji generatemeshfromobjfile() wewnątrz initializegl() m_meshes.insert("bunny", new CMesh); m_meshes["bunny"]->generatemeshfromobjfile("resources/bunny.obj"); Aby wyrenderować wczytany obiekt trzeba postąpić tak samo jak z innymi wygenerowanymi obiektami. worldmatrixstack.push(m_world); m_world.translate(0.0f, 0.0f, 0.0f); m_world.scale(qvector3d(0.1f, 0.1f, 0.1f)); settransforms(); m_program->setuniformvalue(m_modelcolorloc,qvector3d(1.0f, 1.0, 1.0)); m_meshes["bunny"]->render(this); m_world = worldmatrixstack.pop(); 5/13

Wczytanie OBJ - efekt końcowy 6/13

Pierwszym etapem jest uwzględnienie wektorów normalnych. Są one już zaimplementowane w generowaniu sześcianu, sfery, a także w wczytanym projekcie. W programie cieniującym jest on wczytywany jako atrybut normal. Atrybuty występują jedynie wewnątrz vertex shader a, aby zmodyfikować na podstawie jego kolor, należy przenieść go do fragment shader a, interpolując go. Do vertex oraz fragment shadera należy dodać nową zmienną typu varying, czyli taką którą można przekazywać między shaderami. varying highp vec3 fragnormal; Następnie przekazujemy w vertex shaderze atrybut normal wewnątrz funkcji main() fragnormal = normal; Następnie wewnątrz funkcji main() w fragment shaderze przypisujemy kolor piksela na wektor normalny. gl_fragcolor = vec4(fragnormal, 1.0); Skopiować edytowane shadery do folderu resource. 7/13

- efekt końcowy 8/13

1/3 Mając wektory normalne wewnątrz fragment shadera, można je wykorzystać aby kolor obiektu był zależny od położenia względem źródła światła. Do vertex i fragment shader a należy dodać strukturę Light oraz zmienną uniform jej typu. struct Light { highp vec3 position; // Pozycja źródła światła highp vec3 ambient; // Składowa światła niezależna od kąta padania na powierzchnię highp vec3 diffuse; // Składowa światła zależna od kąta padania na powierzchnię }; uniform Light light; Następnie w celu przeprowadzenia dalszych obliczeń, musimy obliczyć wierzchołków w przestrzeni świata. Aby to uczynić dodajemy zmienną variable w obydwóch shaderach varying highp vec3 vertexworldspace; W funkcji main() w vertex shaderze interpolujemy tą zmienną do fragment shadera (aby były w przestrzeni świata, mnożymy wierzchołek przez macierz modelu). vertexworldspace = (modelmatrix * vertex).xyz; 9/13

2/3 Mamy już wszystkie dane potrzebne do wykonania prostego równania oświetlenia. W funkcji main() we fragment shaderze wykonujemy obliczenia. Obliczamy wektor N, znormalizowany wektor normalny. highp vec3 N = normalize(fragnormal); Obliczamy wektor L, znormalizowany wektor od pozycji wierzchołka do pozycji źrodła światła. highp vec3 L = normalize(light.position - vertexworldspace); Obliczamy cosinus kąta pomiędzy wektorami N i L za pomocą iloczynu skalarnego. highp float cosnl = dot(n, L); Nanosimy poprawkę na obliczony cosinus dzięki użyciu operacji tzw. clamplingu (przycinania), aby był w przedziale [0, 1]. cosnl = clamp(cosnl, 0.0, 1.0); Obliczamy składową ambient dla fragmentu. highp vec3 coloramb = modelcolor * light.ambient; Obliczamy składową diffuse dla fragmentu. highp vec3 colordif = modelcolor * light.diffuse * cosnl; Sumujemy te dwie składowe, przy okazji je clampując. highp vec3 colorfull = clamp(coloramb + colordif, 0.0, 1.0); Przypisujemy wyliczoną sumę do końcowego koloru fragmentu. gl_fragcolor = vec4(colorfull, 1.0); Pamiętamy o kopiowaniu shaderów do folderu resource. 10/13

3/3 Po napisaniu równania oświetlenia w vertex i fragment shaderze, należy przekazać do nich odpowiednie dane. Najpierw pobieramy lokację tych zmiennych w shaderze. W klasie glwidget deklarujemy w pliku glwidget.h strukturę. struct LightLocStruct { int position; int ambient; int diffuse; }; I obiekt tej struktury. LightLocStruct m_lightloc; W funkcji initializegl() w pliku glwidget.cpp pobieramy lokacje i zapisujemy ją do stworzonej struktury. m_lightloc.position = m_program->uniformlocation("light.position"); m_lightloc.ambient = m_program->uniformlocation("light.ambient"); m_lightloc.diffuse = m_program->uniformlocation("light.diffuse"); W funkcji paintgl() (na początku) możemy ustawić parametry światła. m_program->setuniformvalue(m_lightloc.position, QVector3D(0.0f, 0.0f, 15.0f)); m_program->setuniformvalue(m_lightloc.ambient, QVector3D(0.1f, 0.1f, 0.1f)); m_program->setuniformvalue(m_lightloc.diffuse, QVector3D(0.9f, 0.9f, 0.9f)); 11/13

- efekt końcowy 12/13

Wersja podstawowa - 0.75pkt ambient i diffuse. Wczytanie pliku bunny.obj i wyrenderowanie go. Wczytanie własnego modelu. Poruszające się źródło światła. Wersja rozszerzona - 1.00pkt Wersja podstawowa. Zaimplementować więcej źródeł światła. 13/13