Laboratorium 4 OpenGl (4) Oświetlenie sceny

Podobne dokumenty
Laboratorium 2. Część I. Perspektywa. Obsługa poleceń myszy. 2. W sekcji przeznaczonej na definicję zmiennych globalnych dodaj następujące definicje:

OpenGL Światło (cieniowanie)

OpenGL Światło (cieniowanie)

Tekstury. Dorota Smorawa

Teksturowanie. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 10. Tekstury. Proces nakładania tekstury.

6 Przygotował: mgr inż. Maciej Lasota

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

Światła i rodzaje świateł. Dorota Smorawa

Światło. W OpenGL można rozróżnić 3 rodzaje światła

OpenGL teksturowanie

Teksturowanie (ang. texture mapping)

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

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

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

Materiały. Dorota Smorawa

OpenGL model oświetlenia

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

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

Laboratorium Grafiki Komputerowej i Animacji. Ćwiczenie VI. Biblioteka OpenGL - teksturowanie

OpenGL - tekstury Mapowanie tekstur

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

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

Laboratorium Grafiki Komputerowej i Animacji. Ćwiczenie VI. Biblioteka OpenGL - teksturowanie

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

Temat: Transformacje 3D

GRK 4. dr Wojciech Palubicki

0. OpenGL ma układ współrzędnych taki, że oś y jest skierowana (względem monitora) a) w dół b) w górę c) w lewo d) w prawo e) w kierunku do

Oświetlenie obiektów 3D

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

Gry komputerowe, Informatyka N1, III Rok

Bartosz Bazyluk POTOK RENDEROWANIA Etapy renderowania w grafice czasu rzeczywistego. Grafika Komputerowa, Informatyka, I Rok

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

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

Rysowanie punktów na powierzchni graficznej

Plan wykładu. Akcelerator 3D Potok graficzny

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

OPEN_GL LABORATORIUM 6. tekst na podstawie: Edwarda Angela oraz Łukasza Grabca

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

Lab 9 Podstawy Programowania

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Ustawienia materiałów i tekstur w programie KD Max. MTPARTNER S.C.

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

8 Przygotował: mgr inż. Maciej Lasota

2 Przygotował: mgr inż. Maciej Lasota

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

3 Przygotował: mgr inż. Maciej Lasota

Julia 4D - raytracing

OpenGL oświetlenie i tekstury. OpenGL oświetlenie. Bogdan Kreczmer.

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

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

Janusz Ganczarski. OpenGL Pierwszy program

Zatem standardowe rysowanie prymitywów wygląda następująco:

Zadania domowe. Ćwiczenie 2. Rysowanie obiektów 2-D przy pomocy tworów pierwotnych biblioteki graficznej OpenGL

Pliki. Informacje ogólne. Obsługa plików w języku C

Zaprojektować i zaimplementować algorytm realizujący następujące zadanie.

Grafika 3D OpenGL część II

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

Grafika komputerowa Tekstury

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

OpenGL. Silicon Graphics (IRIS GL stacje graficzne)

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

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

System graficzny. Potok graficzny 3D. Scena 3D Zbiór trójwymiarowych danych wejściowych wykorzystywanych do wygenerowania obrazu wyjściowego 2D.

Formaty plików graficznych - wprowadzenie

GRAFIKA CZASU RZECZYWISTEGO Interakcja, ruch kamery, oświetlenie.

OpenGL przezroczystość

Transformacje. dr Radosław Matusik. radmat

GRAKO: ŚWIATŁO I CIENIE. Modele barw. Trochę fizyki percepcji światła. OŚWIETLENIE: elementy istotne w projektowaniu

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

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

1. Prymitywy graficzne

Autodesk 3D Studio MAX Teksturowanie modeli 3D

Grafika komputerowa. Dla DSI II

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

2 Przygotował: mgr inż. Maciej Lasota

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wprowadzenie. Artur Staszczyk Bartłomiej Filipek

Wymagania z matematyki na poszczególne stopnie szkolne w klasie trzeciej gimnazjum

Zapisywanie algorytmów w języku programowania

OpenGL Zaawansowana grafika komputerowa

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Grafika rastrowa (bitmapa)-

GRAFIKA KOMPUTEROWA 10: Antyaliasing

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM)

Struktury. Przykład W8_1

54. Układy współrzędnych

Programowanie strukturalne i obiektowe. Funkcje

Efekt lustra 3D w OpenGL z wykorzystaniem bufora szablonowego (stencil buffer)

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Logo Komeniusz. Gimnazjum w Tęgoborzy. Mgr Zofia Czech

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19. Lab 9. Tablice liczbowe cd,. Operacje na tablicach o dwóch indeksach.

Pasek menu. Ustawienia drukowania

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Jak dodać własny szablon ramki w programie dibudka i dilustro

Technologie Informacyjne

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

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

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

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

Transkrypt:

Laboratorium 4 OpenGl (4) Oświetlenie sceny Przy generacji obrazu obiektu do obliczeń oświetlenia mechanizm renderujący OpenGL wykorzystuje model oświetlenia Phonga. Model ten służy do obliczania oświetlenia punktu leżącego na powierzchni obiektu 3-D dla dość ogólnego przypadku, zarówno w sensie oświetlenia, jak i charakterystyki powierzchni obiektu. Model pozwala na połączenie własności rozpraszania światła i odbicia kierunkowego oraz na intuicyjne powiązanie zależności otrzymywanego efektu oświetlenia z wartościami liczbowymi parametrów. Model Phonga zadany jest wzorami pozwalającymi na obliczenie trzech składowych (R, G, B) intensywności oświetlenia analizowanego punktu powierzchni obiektu. Wielkości oznaczone literami k, I, a, b, c i n występują w poniżej podanym kodzie, przy czym indeksy a, d, i s dotyczą odpowiednio światła otoczenia (ambient), światła rozproszonego (diffuse) i światła kierunkowego (specular). Symbole oznaczone dużymi literami N, L, R, i V są wektorami jednostkowymi, a ich mnożenie oznacza operację iloczynu skalarnego. Wektor N jest wektorem normalnym do powierzchni w analizowanym punkcie. Wektor L wyznacza kierunek padania światła na oświetlany punkt. Wektor R określa kierunek odbicia promienia dla idealnego zwierciadła a wektor V kierunek obserwacji punktu. Interpretację wymienionych wektorów pokazano na rysunku Jak można łatwo policzyć dla zdefiniowania materiału z jakiego wykonany jest obiekt i opisania jednego na razie źródła światła potrzeba aż 22 parametrów liczbowych i trzech wektorów (wektor R jest przekształconym wektorem L). Parametry liczbowe zostały bezpośrednio podane w przykładowym kodzie, natomiast informacja o wektorach zawarta jest w opisie sceny w sposób pośredni i odpowiednio interpretowana przez system generacji efektów oświetlenia. Wektor L wynika z położenia źródła światła i oświetlonego punktu powierzchni. Współrzędne położenia źródła światła zostały jawnie wpisane w kodzie. Wektor N, czyli wektor normalny do powierzchni w analizowanym punkcie na razie w kodzie nie występuje, a wektor opisujący kierunek obserwacji V wynika ze sposobu rzutowania, który zdefiniowano w funkcji RespaheWindow(). Znajomość modelu Phonga pozwala na w miarę proste i intuicyjne manipulowanie parametrami materiału i źródła światła. 1. Zmodyfikuj program z poprzedniego laboratorium zmieniając rysowanie dzbanka szkieletowego glutwireteapot() na wypełniony glutsolidteapot(). 2. W funkcji InitOpengl() dodaj: // współczynniki ka =[kar,kag,kab] dla światła otoczenia GLfloat mat_ambient[] = 1.0, 1.0, 1.0, 1.0}; // współczynniki kd =[kdr,kdg,kdb] światła rozproszonego GLfloat mat_diffuse[] = 1.0, 1.0, 1.0, 1.0};

// współczynniki ks =[ksr,ksg,ksb] dla światła odbitego GLfloat mat_specular[] = 1.0, 1.0, 1.0, 1.0}; // współczynnik n opisujący połysk powierzchni GLfloat mat_shininess = 20.0}; // Definicja źródła światła // położenie źródła GLfloat light_position[] = 0.0, 0.0, 10.0, 1.0}; // składowe intensywności świecenia źródła światła otoczenia // Ia = [Iar,Iag,Iab] GLfloat light_ambient[] = 0.1, 0.1, 0.1, 1.0}; // składowe intensywności świecenia źródła światła powodującego // odbicie dyfuzyjne Id = [Idr,Idg,Idb] GLfloat light_diffuse[] = 1.0, 1.0, 1.0, 1.0}; // składowe intensywności świecenia źródła światła powodującego // odbicie kierunkowe Is = [Isr,Isg,Isb] GLfloat light_specular[]= 1.0, 1.0, 1.0, 1.0}; // składowa stała ds dla modelu zmian oświetlenia w funkcji // odległości od źródła GLfloat att_constant = 1.0}; // składowa liniowa dl dla modelu zmian oświetlenia w funkcji // odległości od źródła GLfloat att_linear = 0.05}; // składowa kwadratowa dq dla modelu zmian oświetlenia w funkcji // odległości od źródła GLfloat att_quadratic = 0.001}; // Ustawienie parametrów materiału i źródła światła // Ustawienie patrametrów materiału glmaterialfv(gl_front, GL_SPECULAR, mat_specular); glmaterialfv(gl_front, GL_AMBIENT, mat_ambient); glmaterialfv(gl_front, GL_DIFFUSE, mat_diffuse); glmaterialf(gl_front, GL_SHININESS, mat_shininess); // Ustawienie parametrów źródła gllightfv(gl_light0, GL_AMBIENT, light_ambient); gllightfv(gl_light0, GL_DIFFUSE, light_diffuse); gllightfv(gl_light0, GL_SPECULAR, light_specular); gllightfv(gl_light0, GL_POSITION, light_position); gllightf(gl_light0, GL_CONSTANT_ATTENUATION, att_constant); gllightf(gl_light0, GL_LINEAR_ATTENUATION, att_linear); gllightf(gl_light0, GL_QUADRATIC_ATTENUATION, att_quadratic); // Ustawienie opcji systemu oświetlania sceny glshademodel(gl_smooth); // właczenie łagodnego cieniowania glenable(gl_lighting); // właczenie systemu oświetlenia sceny glenable(gl_light0); // włączenie źródła o numerze 0 glenable(gl_depth_test); // włączenie mechanizmu z-bufora 3. Skompiluj i uruchom program.

Nakładanie tekstury W realnym świecie powierzchnia obiektów ma fakturę. W OpenGL mechanizm pozwalający nadać obiektom fakturę nazywa się teksturowaniem. Tekstura jest plikiem graficznym, którego zawartość zostaje nałożona na powierzchnie obiektów występujących w scenie. Tekstura musi spełniać ważny i nietrudny do zrealizowania warunek - jej rozmiar w pikselach musi być potęgą dwójki. Oznacza to, że wysokość i szerokość pliku z teksturą może być jedną z następujących wartości: 2, 4, 8 i tak dalej, aż do 2048. Ograniczenie to zostało wprowadzone przez projektantów kart graficznych i w praktyce nie stanowi żadnego utrudnienia. Ogólnie proces teksturowania zawiera się w trzech krokach. Krok pierwszy polega na wczytaniu do pamięci obrazu tekstury zawartego w pliku. Krok drugi polega na definiowaniu struktury tekstury zawierającej sposób interpretacji danych pobranych z pliku. W kroku trzecim nakładamy teksturę na powierzchnie obiektu w scenie, inaczej dokonujemy jej mapowania. Korzystając z samego OpenGL a jesteśmy w stanie zrealizować dwa pierwsze kroki. Funkcje ładowania z pliku do pamięci tekstury pochodzą z innych bibliotek narzędziowych bądź można je samemu oprogramować znając strukturę danego formatu graficznego, na przykład formatu TGA (TarGA). 4. Zastąp rysowanie czajnika rysowaniem trójkąta (bez osi układu współrzędnych). 5. W razie potrzeby zmodyfikuj oświetlenie trójkąta. Najlepiej aby trójkąt i światło miały kolor biały. 6. Dodaj do programu kod funkcji realizujący wczytywanie obrazu graficznego zapisanego w formacie TGA w razie problemów ze stałymi konieczne może być ściągnięcie i zainkludowanie pliku glext.h. // Funkcja wczytuje dane obrazu zapisanego w formacie TGA w pliku o nazwie // FileName, alokuje pamięć i zwraca wskaźnik (pbits) do bufora w którym // umieszczone są dane. // Ponadto udostępnia szerokość (ImWidth), wysokość (ImHeight) obrazu // tekstury oraz dane opisujące format obrazu według specyfikacji OpenGL // (ImComponents) i (ImFormat). // Jest to bardzo uproszczona wersja funkcji wczytującej dane z pliku TGA. // Działa tylko dla obrazów wykorzystujących 8, 24, or 32 bitowy kolor. // Nie obsługuje plików w formacie TGA kodowanych z kompresją RLE. GLbyte *LoadTGAImage(const char *FileName, GLint *ImWidth, GLint *ImHeight, GLint *ImComponents, GLenum *ImFormat) // Struktura dla nagłówka pliku TGA #pragma pack(1) typedef struct GLbyte idlength; GLbyte colormaptype; GLbyte datatypecode; unsigned short colormapstart; unsigned short colormaplength; unsigned char colormapdepth; unsigned short x_orgin; unsigned short y_orgin; unsigned short width; unsigned short height; GLbyte bitsperpixel; GLbyte descriptor; }TGAHEADER; #pragma pack(8) FILE *pfile; TGAHEADER tgaheader; unsigned long limagesize; short sdepth; GLbyte *pbitsperpixel = NULL; // Wartości domyślne zwracane w przypadku błędu *ImWidth = 0; *ImHeight = 0; *ImFormat = GL_BGR_EXT; *ImComponents = GL_RGB8; pfile = fopen(filename, "rb"); if(pfile == NULL) // Przeczytanie nagłówka pliku

fread(&tgaheader, sizeof(tgaheader), 1, pfile); // Odczytanie szerokości, wysokości i głębi obrazu *ImWidth = tgaheader.width; *ImHeight = tgaheader.height; sdepth = tgaheader.bitsperpixel / 8; // Sprawdzenie, czy głębia spełnia założone warunki (8, 24, lub 32 bity) if(tgaheader.bitsperpixel!= 8 && tgaheader.bitsperpixel!= 24 && tgaheader.bitsperpixel!= 32) // Obliczenie rozmiaru bufora w pamięci limagesize = tgaheader.width * tgaheader.height * sdepth; // Alokacja pamięci dla danych obrazu pbitsperpixel = (GLbyte*)malloc(lImageSize * sizeof(glbyte)); if(pbitsperpixel == NULL) if(fread(pbitsperpixel, limagesize, 1, pfile)!= 1) free(pbitsperpixel); } // Ustawienie formatu OpenGL switch(sdepth) case 3: }; case 4: case 1: break; *ImFormat = GL_BGR_EXT; *ImComponents = GL_RGB8; break; *ImFormat = GL_BGRA_EXT; *ImComponents = GL_RGBA8; break; *ImFormat = GL_LUMINANCE; *ImComponents = GL_LUMINANCE8; fclose(pfile); } return pbitsperpixel; 7. W funkcji InitOpengl() dopisz kilka linii kodu zawierającego podstawowe funkcje definiujące właściwości procesu teksturowania. Najważniejsze z tych funkcji to: glteximage2d() służąca do definiowania tekstury dwuwymiarowej, gltexenvi() określająca tak zwany tryb teksturowania i gltexparameteri() opisująca sposób nakładania tekstury na powierzchnie modeli obiektów. Wybierz teksturę z załączonego zbioru. void InitOpengl() // Zmienne dla obrazu tekstury GLbyte *pbytes; GLint ImWidth, ImHeight, ImComponents; GLenum ImFormat; // Pozostała część funkcji deklaracji // Teksturowanie będzie prowadzone tyko po jednej stronie ściany

glenable(gl_cull_face); // Przeczytanie obrazu tekstury z pliku o nazwie tekstura.tga pbytes = LoadTGAImage("tekstura.tga", &ImWidth, &ImHeight, &ImComponents, &ImFormat); // Zdefiniowanie tekstury 2-D glteximage2d(gl_texture_2d, 0, ImComponents, ImWidth, ImHeight, 0, ImFormat, GL_UNSIGNED_BYTE, pbytes); // Zwolnienie pamięci free(pbytes); // Włączenie mechanizmu teksturowania glenable(gl_texture_2d); // Ustalenie trybu teksturowania gltexenvi(gl_texture_env, GL_TEXTURE_ENV_MODE, GL_MODULATE); // Określenie sposobu nakładania tekstur gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gltexparameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Pozostała część funkcji } 8. Na zakończenie w funkcji definiującej obiekt (trójkąt) należy wprowadzić współrzędne wzorca tekstury definiujące fragment obrazu, jaki ma być naniesiony na powierzchnię trójkąta. Sposób interpretowania współrzędnych texeli pokazuje rysunek poniżej. Za pomocą funkcji gltexcoord2f () możemy określić przyporządkowanie wybranych punktów (texeli) tekstury punktom (wierzchołkom) na powierzchni danego obiektu. Poniżej przedstawiony jest sposób użycia tej funkcji. glbegin(gl_triangles); gltexcoord2f(0.0f, 0.0f); glvertex3f(...); gltexcoord2f(1.0f, 0.0f); glvertex3f(...); gltexcoord2f(0.5f, 1.0f); glvertex3f(...);

glend(); UWAGA! W przypadku gdyby tekstura nakładała się nie na tej stronie co trzeba proszę spróbować odwrócić orientacje poligonów dodając glcullface(gl_front); po linijce włączającej GL_CULL_FACE. W jak było wcześniej wspomniane za przebieg procesu teksturowania odpowiedzialne są głównie trzy funkcje umieszczone w funkcji InitOpengl(). Są to funkcje: glteximage2d(), gltexenvi() i gltexparameteri(). Omówiona zostanie teraz kolejno ich rola. Funkcja glteximage2d() definiuje teksturę dwuwymiarową i określona jest jako: void glteximage2d(glenum target, GLint level, GLint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) Argumenty mają następujące znaczenie: Argument target level Opis Rodzaj definiowanej tekstury, zawsze powinno być GL_TEXTURE_2D Poziom szczegółowości. Jest ustawiany na 0 gdy mipmapy nie są stosowane, gdy mipmapy są używane level jest liczbą określająca poziom redukcji obrazu tekstury. components Ilość używanych składowych koloru, liczba od 1 do 4. width heigth Szerokość obrazu tekstury, zawsze jest potęgą liczby 2, może być powiększona o szerokość tak zwanej ramki tekstury Wysokość obrazu tekstury, zawsze jest potęgą liczby 2, może być powiększona o szerokość ramki tekstury. border Szerokość ramki tekstury, może wynosić 0, 1 lub 2 format type Format danych obrazu tekstury, określa co opisują dane, czy są indeksami kolorów czy ich składowymi (np. R, G, B) i w jakiej są podane kolejności. Typ danych dla punktów obrazu tekstury, określa jak kodowane są dane, istnieje możliwość używania różnych formatów liczb, od 8 bitowych liczb stałoprzecinkowych, do 32 bitowych liczb zmiennoprzecinkowych. piksels Tablica o rozmiarze width x height x components, w której znajdują się dane z obrazem tekstury. Szczegółowe informacje o możliwych ustawieniach poszczególnych argumentów (dotyczy to w szczególności argumentów format i type) można znaleźć w dokumentacji OpenGL. Funkcja gltexenvi() służy do ustalenia tak zwanego trybu teksturowania, czyli sposobu łączenia koloru piksela obrazu tekstury z kolorem piksela ekranu. Prototyp funkcji ma postać: void gltexenvi( GLenum target, GLenum pname, GLint param ) Argument target należy ustawić na GL_TEXTURE_ENV, a pname na GL_TEXTURE_ENV_MODE. Sposób łączenia pikseli tekstury i ekranu określa trzeci z argumentów param, który może przyjmować cztery wartości: GL_MODULATE - kolor piksela ekranu jest mnożony przez kolor piksela tekstury, następuje w ten sposób mieszanie barw tekstury i tego co jest teksturowane, GL_DECAL - piksele tekstury zastępują piksele na ekranie, GL_BLEND - kolor piksela ekranu jest mnożony przez kolor piksela tekstury i łączony ze stałym kolorem, GL_REPLACE - działa podobnie jak GL_DECAL różnica występuje wtedy, gdy wprowadzona zostaje przezroczystość. Funkcja gltexparameteri() pozwala między innymi na określenie algorytmów dodawania nowych piksel w przypadku, gdy w obrazie tekstury jest za mało punktów aby wypełnić obraz teksturowanego elementu oraz usuwania pikseli, gdy w obrazie tekstury jest ich za dużo. Umożliwia także określenie sposobu postępowania w przypadku, gdy zadane w programie współrzędne tekstury wykraczają poza zakres [0, 1]. Definicja funkcji wygląda następująco:

void gltexparameteri(glenum target, GLenum pname, GLint param) Argument target w przypadku tekstur dwuwymiarowych (tylko takich dotyczy niniejsze ćwiczenie) należy ustawić na GL_TEXTURE_2D. Pozostałe dwa argumenty pname i param dotyczą szczegółów działania algorytmów teksturowania. Zestawienie wartości tych parametrów zawiera poniższa tabela. pname param GL_TEXTURE_MIN_FILTER Opisuje w jaki sposób następuje pominiejszanie tekstury (usuwanie pikseli) GL_NEAREST - usuwa się najbliższy (w sensie metryki Manhattan) punkt sąsiedni GL_LINEAR - filtracja liniowa z odpowiednimi wagami GL_TEXTURE_MAG_FILTER Opisuje w jaki sposób następuje powiększanie tekstury (dodawanie pikseli) GL_NEAREST - dodaje się najbliższy (w sensie metryki Manhattan) punkt sąsiedni GL_LINEAR - interpolacja liniowa wykorzystująca wartości sąsiednich pikseli GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T Opisuje sposób traktowania współrzędnej s tekstury, gdy wykracza ona poza zakres [0, 1] GL_CLAMP - poza zakresem stosowany jest kolor ramki tekstury lub stały kolor GL_REPEAT - tekstura jest powtarzana na całej powierzchni wielokąta Opisuje sposób traktowania współrzędnej t tekstury, gdy wykracza ona poza zakres [0, 1] GL_CLAMP - poza zakresem stosowany jest kolor ramki tekstury lub stały kolor GL_REPEAT - tekstura jest powtarzana na całej powierzchni wielokąta Szczegółowe informacje o funkcjonowaniu algorytmów wybieranych przy pomocy argumentów pname i param można znaleźć w dokumentacji OpenGL. 9. Napisz program rysujący obraz piramidy, czyli ostrosłupa o podstawie kwadratu. Poszczególne ściany ostrosłupa maja być teksturowane tylko z jednej, widocznej strony. Przy pisaniu programu należy kontrolować prawidłowość rysowania kolejnych ścian aż do zamknięcia ostrosłupa. Aby można było sprawdzić prawidłowość rysowania obrazów ścian bryły, należy wprowadzić sterowanie widocznością poszczególnych ścian przy pomocy klawiszy, na przykład od 1 do 5.