OpenGL – oświetlenie sceny

Transkrypt

OpenGL – oświetlenie sceny
#include <windows.h>
#include <gl/glut.h>
#include <gl/glu.h>
float kat=0.0f;
void renderujScene(void) {
glClearColor(1.0f,1.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(kat,0,0,1);
glBegin(GL_QUADS);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-5.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,-5.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,-5.0f);
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(-1.0f,1.0f,-5.0f);
glEnd();
glPopMatrix();
kat+=0.2f;
glutSwapBuffers();
}
Grafika 3D
OpenGL – częśd III
Oświetlenie, materiały, tablice wierzchołków, tekstury,
filtrowanie tekstur, mapowanie tekstur.
Michał Dudkiewicz
[email protected]
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – oświetlenie sceny
OpenGL udostępnia osiem niezależnych źródeł światła, GL_LIGHT0, GL_LIGHT1
itd. do GL_LIGHT7. Żeby światła zostały w ogóle uwzględnione w tworzonej
scenie, należy je włączyd. Robimy to, korzystając z funkcji:
glEnable(GL_LIGHTING);
Jeśli z jakiś powodów chcemy, żeby częśd elementów nie była oświetlona,
możemy w każdej chwili wyłączyd oświetlenie:
glDisable(GL_LIGHTING);
Poszczególne światła włączamy
glEnable(GL_LIGHT0);
2
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – oświetlenie sceny
Źródła światła określane są za pomocą trzech składowych RGB, definiujących
barwę promieni. Każde źródło światła możemy opisad za pomocą trzech
odmiennych rodzajów oświetlenia:
GL_AMBIENT - światło otaczające - nie pochodzi z żadnego kierunku, chod ma
źródło. Wszystkie obiekty na scenie są nim równomiernie oświetlone ze
wszystkich stron i na wszystkich powierzchniach.
GL_DIFFUSE - światło rozproszone - ma zdefiniowane źródło i z tego kierunku
pochodzi. Jasnośd powierzchni zależy od kąta, pod jakim pada na nią światło.
GL_SPECULAR - światło odbłysków - ma kierunek i jest odbijane od
powierzchni w jedną stronę.
3
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – oświetlenie sceny
Parametry światła definiujemy za pomocą funkcji
glLightfv(swiatlo,typ,macierz_parametrow);
Przykład:
float swiatlo_otoczenia[]
float swiatlo_rozproszone[]
float swiatlo_odbite[]
float swiatlo_pozycja[]
glLightfv(
glLightfv(
glLightfv(
glLightfv(
GL_LIGHT0,
GL_LIGHT0,
GL_LIGHT0,
GL_LIGHT0,
=
=
=
=
{
{
{
{
0.1,
0.2,
1.0,
0.0,
0.1,
0.2,
0.2,
0.0,
0.1, 1.0};
0.6, 1.0};
0.2, 1.0};
-20.0, 1.0};
GL_AMBIENT, swiatlo_otoczenia);
GL_DIFFUSE, swiatlo_rozproszone);
GL_SPECULAR, swiatlo_odbite);
GL_POSITION, swiatlo_pozycja);
4
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – oświetlenie sceny (materiał)
Materiały, podobnie jak światła, opisywane są za pomocą trzech składowych.
Opisują zdolności refleksyjno-emisyjne danej powierzchni. Do tworzenia
materiału służy funkcja:
glMaterialfv(face,typ,tablica_parametrów);
face opisuje stronę obiektu i może przyjmowad jedną z poniższych wartości:
GL_FRONT - opisujemy frontową płaszczyznę prymitywów,
GL_BACK - odwołujemy się do tylnej płaszczyzny,
FRONT_AND_BACK - zarówno przednia, jak i tylna płaszczyzna
typ przyjmuje jedną z wymienionych wcześniej wartości GL_AMBIENT,
GL_DIFFUSE, GL_SPECULAR i za jego pomocą powiadamiamy bibliotekę, jakie
właściwości refleksyjne definiujemy.
5
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – oświetlenie sceny (materiał)
Przykład:
float material[] = { 0.5, 0.5, 0.5, 1.0};
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,Material);
W ten sposób utworzyliśmy materiał, którego współczynniki odbicia trzech
składowych wynoszą 0,5. Oznacza to, że materiał odbija połowę składowej
czerwonej, zielonej i niebieskiej padającego na nią światła.
W przypadku światła białego wielokąt będzie szary. Gdybyśmy ustawili
właściwości materiału na *0,0,1,1+, to przy białym świetle odbita zostałaby tylko
składowa niebieska i obiekty widzielibyśmy jako niebieskie. Gdy światło ustawimy
na *1,0,0,1+ (kolor czerwony), obiekt będzie czarny, ponieważ czerwona składowa
światła zostanie pochłonięta przez materiał, a niebieska, którą ten materiał
odbija, w świetle nie występuje.
6
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – oświetlenie sceny
Dla prawidłowego oświetlenia danego punktu obiektu potrzebna jest informacja
o lokalnej (w otoczeniu tego punktu) geometrii powierzchni. Informacja ta
opisana jest przez wektor normalny (dla każdej powierzchni są dwa takie
wektory).
glNormal3f(x,y,z);
Wektor taki powinien byd znormalizowany (jednostkowy).
Można włączyd automatyczną normalizację wektorów.
glEnable(GL_NORMALIZE);
7
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – tablice wierzchołków
Tablice wierzchołków (Vertex Arrays) – mechanizm OpenGL mający na celu
znaczące zwiększenie wydajności renderowania obiektów. Za pomocą tablic lub
jednej tablicy definiuje się współrzędne wierzchołków, kolory, wektory normalne,
współrzędne tekstury.
Przykład:
struct tablica_wierzcholkow {
float kolor[3];
float wspolrzedne_wierzcholka[3];
} ;
Ważna jest kolejnośd składowych (ta kolejnośd jest zdefiniowana w OpenGL
i nie można jej zmienid)
8
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – tablice wierzchołków
Definiujemy sześcian jako tablicę wierzchołków (kolor, wierzchołek)
tablice_wierzcholkow szescian[] = {
// sciana gorna
{ 0.0f, 0.0f,1.0, 1.0f, 1.0f,-1.0f
{ 1.0f, 0.0f,1.0, -1.0f, 1.0f,-1.0f
{ 1.0f, 1.0f,1.0, -1.0f, 1.0f, 1.0f
{ 0.0f, 1.0f,1.0, 1.0f, 1.0f, 1.0f
. . .
}
},
},
},
},
W funkcji renderującej umieszczamy
glDrawArrays(GL_QUADS, 0, 24);
9
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – tablice wierzchołków
Funkcja inicjująca użycie tablicy wierzchołków
glInterleavedArrays(GL_C3F_V3F, 0, szescian);
pierwszy parametr oznacza rozmieszczenie i rodzaj danych w tablicy wierzchołków,
możliwe wartości: GL_V2F, GL_V3F, GL_N3F_V3F, GL_T2F_V3F, GL_T4F_V4F,
GL_T2F_C3F_V3F, GL_T2F_N3F_V3F, GL_T2F_C4F_N3F_V3F
drugi parametr to offset – oznacza co ile elementów tablicy znajdują się dane
obiektu, czyli ile elementów OpenGL ma przeskoczyd po każdym wierzchołku
trzeci parametr to zdefiniowana wcześniej tablica wierzchołków
10
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – teksturowanie
Teksturowanie – proces nakładania na obiekty obrazów mających na celu nadanie
obiektowi cech z realnego świata (np.: marmur, drewno)
Teksturowanie w OpenGL przebiega w 3 etapach:
1.
Utworzenie tablicy przechowującej teksturę (tekstury)
GLuint texture[1];
2.
Wczytanie bitmapy i utworzenie z niej tekstury (na dwa sposoby z użyciem
tzw. mipmap i bez użycia mipmap)
gluBuild2DMipmaps(); glTexImage2D();
3.
Przypisanie wcześniej utworzonej tekstury do obiektu
glBindTexture(GL_TEXTURE_2D,texture);
11
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
Teksturowanie (mipmaping)
Mipmapping – technika teksturowania bitmapami wykorzystywana w grafice
trójwymiarowej, która pozwala uniknąd artefaktów i tym samym uzyskad lepszą
jakośd obrazów. Przyspiesza sam proces teksturowania. Mipmapping został
opracowany 1983 roku.
12
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – tworzenie tekstury
Tworzenie tekstury z mipmapami
gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB,
GL_UNSIGNED_BYTE, TextureImage[0]->data);
Tworzenie tekstury bez mipmap
glTexImage2D(GL_TEXTURE_2D, 0, 3,
TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
13
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – tworzenie tekstury
Uwaga !
Szerokośd i wysokośd tekstur, których używamy ZAWSZE! są potęgą 2.
Oznacza to, że tekstura musi byd w rozdzielczości np. 64x64, 2048x2048, czy też
4096x4096.
Istnieją funkcje, które pozwolą na wczytanie tekstur o dowolnych rozdzielczościach,
ale i tak OpenGL przekształci je do potęgi 2.
14
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – filtrowanie tekstury
Funkcja glTexParameteri(GL_TEXTURE_2D,parametr,wartosc);
Parametr może przyjmowad jedną z wartości:
GL_TEXTURE_MIN_FILTER - określa, że chcemy ustalid filtr używany przy
zmniejszaniu tekstury
GL_TEXTURE_MAG_FILTER - określa, że chcemy ustalid filtr używany przy
powiększeniu tekstury (czyli filtr dla tekstury o oryginalnej wielkości)
GL_TEXTURE_WRAP_S - określa, że chcemy ustalid sposób w jaki OpenGL traktuje
współrzędne S tekstury poza zakresem *0, 1+.
GL_TEXTURE_WRAP_T - określa, że chcemy ustalid sposób w jaki OpenGL traktuje
współrzędne T tekstury poza zakresem *0, 1+.
GL_BORDER_COLOR - określa, że chcemy ustalid kolor używany jako ramka
tekstury, jeśli ona sama nie ma zdefiniowanej ramki.
15
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – filtrowanie tekstury
Wartośd jest zależna od poprzedniego parametru. Możliwe do ustalenia filtry to :
GL_NEAREST – czyli nie jest używany żaden filtr - tekstura jest nakładana na
wierzchołek bez żadnych modyfikacji koloru pikseli
GL_LINEAR – ustawia filtrację tekstur polegającą na uśrednianiu koloru
sąsiadujących ze sobą pikseli (interpolacja liniowa, czyli filtrowanie bilinearne).
GL_NEAREST_MIPMAP_NEAREST – to samo co GL_NEAREST tyle, że dodatkowo
przeprowadzany jest mipmapping
GL_NEAREST_MIPMAP_LINEAR – to samo co GL_LINEAR, ale dodatkowo
przeprowadzany jest mipmapping
GL_LINEAR_MIPMAP_NEAREST – następuje interpolacja liniowa sąsiadujących ze
sobą mipmap, ale sama tekstura nie jest filtrowana liniowo.
GL_LINEAR_MIPMAP_LINEAR – czyli „liniowa interpolacja interpolowanych
mipmap”. Jest to interpolacja sąsiadujących ze sobą mipmap, z tym, że tekstura
jest również interpolowana.
16
Laboratorium Grafiki i Multimediów
Grafika 3D - OpenGL
OpenGL – mapowanie tekstury
Dla kolejnych dwóch parametrów (GL_TEXTURE_WRAP_S i GL_TEXTURE_WRAP_T)
trzeci parametr może przyjmowad dwie wartości:
GL_CLAMP
GL_REPEAT
17
Laboratorium Grafiki i Multimediów