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

Podobne dokumenty
dr inż. Jacek Dąbrowski, KSG

Mieszanie kolorów. Dorota Smorawa

Temat: Transformacje 3D

Elementarne obiekty geometryczne, bufory. Dorota Smorawa

Materiały. Dorota Smorawa

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

3 Przygotował: mgr inż. Maciej Lasota

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

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

6 Przygotował: mgr inż. Maciej Lasota

2 Przygotował: mgr inż. Maciej Lasota

GRAFIKA KOMPUTEROWA 8: Konwersja i mieszanie kolorów

Obsługa mapy przy użyciu narzędzi nawigacji

OpenGL przezroczystość

Janusz Ganczarski. OpenGL Pierwszy program

Wprowadzenie do rysowania w 3D. Praca w środowisku 3D

1. Prymitywy graficzne

DesignCAD 3D Max 24.0 PL

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

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

Wykład 4. Rendering (1) Informacje podstawowe

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

OpenGL Światło (cieniowanie)

WASM AppInventor Lab 3. Rysowanie i animacja po kanwie PODSTAWY PRACY Z KANWAMI

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

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

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

Rysowanie punktów na powierzchni graficznej

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

Jeżeli pole Krawędź będzie zaznaczone uzyskamy obramowanie w całej wstawianej tabeli

GRAFIKA KOMPUTEROWA 10: Antyaliasing

Usługi Informatyczne "SZANSA" - Gabriela Ciszyńska-Matuszek ul. Świerkowa 25, Bielsko-Biała

Wstawianie nowej strony

RYSUNEK TECHNICZNY I GEOMETRIA WYKREŚLNA INSTRUKCJA DOM Z DRABINĄ I KOMINEM W 2D

1. Wybierz polecenie rysowania linii, np. poprzez kliknięcie ikony W wierszu poleceń pojawi się pytanie o punkt początkowy rysowanej linii:

Przekształcenia geometryczne. Dorota Smorawa

Grafika 3D OpenGL część II

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

Użycie przestrzeni papieru i odnośników - ćwiczenie

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

OpenGL Światło (cieniowanie)

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

Grafika Komputerowa 3D Etap drugi

WinSkład / WinUcz 15.00

Przewodnik po soczewkach

Animacje z zastosowaniem suwaka i przycisku

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

Rys.1. Uaktywnianie pasków narzędzi. żądanych pasków narzędziowych. a) Modelowanie części: (standardowo widoczny po prawej stronie Przeglądarki MDT)

Obiekt 2: Świątynia Zeusa

1 Wstęp teoretyczny. Temat: Manipulowanie przestrzenią. Grafika komputerowa 3D. Instrukcja laboratoryjna Układ współrzędnych

Edytor tekstu MS Word podstawy

Systemy wirtualnej rzeczywistości. Podstawy grafiki 3D

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

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy.

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

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

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

KD Max 6.0 wersja CastoCad. Pierwsze kroki

Edytor tekstu OpenOffice Writer Podstawy

Tworzenie i modyfikacja modelu geologicznego

Zadanie polega na zbudowaniu i wyświetleniu przykładowej animowanej sceny przedstawiającej robota spawalniczego typu PUMA.

Techniki wstawiania tabel

Ćwiczenie 1 Automatyczna animacja ruchu

Odbicie na szkłach okularów

WYKŁAD 3 WYPEŁNIANIE OBSZARÓW. Plan wykładu: 1. Wypełnianie wieloboku

IRONCAD. TriBall IRONCAD Narzędzie pozycjonujące

Pasek menu. Ustawienia drukowania

Grafika Komputerowa 3D Etap drugi

Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego

- biegunowy(kołowy) - kursor wykonuje skok w kierunku tymczasowych linii konstrukcyjnych;

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

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

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Program graficzny MS Paint.

8 Przygotował: mgr inż. Maciej Lasota

Opis Edytora postaci Logomocji

Adobe InDesign lab.1 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Podstawy pracy z aplikacją Układ strony... 2.

Transformacje. dr Radosław Matusik. radmat

Ćwiczenie pochodzi ze strony

Politechnika Warszawska Wydział Mechatroniki Instytut Automatyki i Robotyki

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

LI Olimpiada Matematyczna Rozwiązania zadań konkursowych zawodów stopnia trzeciego 3 kwietnia 2000 r. (pierwszy dzień zawodów)

WSTĘP; NARZĘDZIA DO RYSOWANIA

OpenGL teksturowanie

I. Program II. Opis głównych funkcji programu... 19

1.1. Przykład projektowania konstrukcji prętowej z wykorzystaniem ekranów systemu ROBOT Millennium

Podstawy Programowania C++

1 Wstęp teoretyczny. Temat: Obcinanie odcinków do prostokąta. Grafika komputerowa 2D. Instrukcja laboratoryjna Prostokąt obcinający

Techniki generowania cieni w grafice 3D z użyciem OpenGL

Rysunek 1: Okno timeline wykorzystywane do tworzenia animacji.

4. Funkcje. Przykłady

Fotografia cyfrowa obsługa programu GIMP. Cz. 18. Tworzenie ramki do zdjęcia. materiały dla osób prowadzących zajęcia komputerowe w bibliotekach

VII. WYKRESY Wprowadzenie

CorelDraw - wbudowane obiekty wektorowe - prostokąty Rysowanie prostokątów

KGGiBM GRAFIKA INŻYNIERSKA Rok III, sem. VI, sem IV SN WILiŚ Rok akademicki 2011/2012


Nadają się do automatycznego rysowania powierzchni, ponieważ może ich być dowolna ilość.

Ustawienia ogólne. Ustawienia okólne są dostępne w panelu głównym programu System Sensor, po kliknięciu ikony

Dodawanie grafiki i obiektów

Następnie zdefiniujemy utworzony szkic jako blok, wybieramy zatem jak poniżej

Transkrypt:

Efekt lustra 3D w OpenGL z wykorzystaniem bufora szablonowego (stencil buffer) Autor: Radosław Płoszajczak Spis treści I. Wstęp...2 II. Metoda rysująca przeźroczystą szybę...2 III. Bufor szablonowy (stencil buffer)...3 IV. Płaszczyzna obcinająca (clip plane)...4 V. Rysowanie lustra...5 VI. Uwagi...9

I. Wstęp Ten tutorial opisuje jak wykonać lustro przy użyciu OpenGL z realistycznym odbiciem wybranych obiektów sceny. W przykładzie zostanie wykorzystany bufor szablonowy (stencil buffer) oraz płaszczyzna obcinająca (clip plane). Dla lepszego efektu obiekt odbijający scenę nie będzie idealnym lustrem lecz refleks zostanie zrealizowany na szybie pomalowanej w kolorową szachownicę. II. Metoda rysująca przezroczystą szybę Pierwszym etapem będzie utworzenie nowej metody w klasie TForm1 rysującej kwadratową szybę, w której będą się odbijać obiekty sceny. Rysowanie realizuje poniższa funkcja w pliku Unit1.cpp: void fastcall TForm1::RysujSzybe() { const float przezroczystosc = 0.3f; const int il_rzedow_kolumn = 8; const GLfloat a = 0.5f; } glpushmatrix(); gltranslatef(-a*il_rzedow_kolumn/2.0f, 0.0f, -a*il_rzedow_kolumn/2.0f); glnormal3f(0.0f, 0.0f, 1.0f); for(int i = 0; i < il_rzedow_kolumn; i++) for(int j = 0; j < il_rzedow_kolumn; j++) { glbegin(gl_quads); if((i + j) % 2) glcolor4f(1.0f, 0.0f, 0.0f, przezroczystosc); //czerwony else glcolor4f(1.0f, 1.0f, 0.0f, przezroczystosc); //zolty glvertex3f(i * a, 0.0f, (j + 1) * a); glvertex3f((i + 1) * a, 0.0f, (j + 1) * a); glvertex3f((i + 1) * a, 0.0f, j * a); glvertex3f(i * a, 0.0f, j * a); glend(); } glpopmatrix(); Na początku zdefiniowane są stałe określające przeźroczystość szyby (wartość koloru alfa), ilość kolumn i rzędów szachownicy oraz wysokość i szerokość każdego pola a. Aby wyśrodkować rysowaną powierzchnię aktualna macierz model widok jest ładowana na stos, a następnie układ współrzędnych przesuwany jest o połowę szerokości i wysokości całej szyby w kierunku ujemnych wartości osi X i Z. Podwójna pętla for tworzy kolejne pola szachownicy od lewej do prawej i z dołu w górę. Gdy suma aktualnej kolumny i wiersza jest parzysta kwadrat jest żółty, a w przeciwnym wypadku czerwony. Następnie aktualna macierz jest zdejmowana ze stosu i układ współrzędnych powraca do poprzedniego stanu. Radosław Płoszajczak 2

III. Bufor szablonowy (stencil buffer) Bufor szablonowy (stencil buffer) jest pomocniczym buforem o rozmiarze takim samym jak bufor kolorów (jak wielkość obszaru OpenGL okna) oraz w zależności od implementacji głębokości od 1 do 8 bitów. Jego zawartość nie jest widoczna na ekranie lecz może posłużyć do wykonywania na niej różnych operacji logicznych, których rezultat określa czy dany fragment przejdzie lub nie test szablonowy. Konieczność wykorzystania bufora szablonowego należy zgłosić już przy tworzeniu okna OpenGL, a konkretnie przy wybieraniu formatu pikseli. W tym celu w metodzie bool GL_UstalFormatPikseli() klasy TGLForm w strukturze opisformatupikseli należy wypełnić dodatkowe pole cstencilbits podając żądaną głębokość bufora. W przykładzie z lustrem wystarczy 1 bit co skutkuje dodaniem następującej linii kodu: opisformatupikseli.cstencilbits = 1; Pomimo, że żąda się od funkcji ChoosePixelFormat() aby wybrała format pikseli z 1-bitowym buforem szablonu może ona zwrócić format pikseli najbliższy podanemu obsługiwany przez sterownik, w którym stencil buffer może mieć np. 8-bitów głębokości. Nie będzie miało to jednak żadnego wpływu na działanie efektu odbić. Przed użyciem bufora szablonowego należy go wyczyścić podobnie jak bufor kolorów czy głębokości: glclear(gl_stencil_buffer_bit); Domyślnie czyszczenie powoduje wypełnienie bufora zerami. Standardową wartość można zmienić podając własną liczbę całkowitą jako parametr funkcji glclearstencil(glint s). Włączenie testu szablonowego wykonuje instrukcja glenable(gl_stencil_test), a wyłączenie analogicznie gldisable(gl_stencil_test). Do kontrolowania zachowania tego testu służą dwie funkcje. Pierwszą z nich jest: glstencilfunc(glenum func, Glint ref, Gluint mask) Jej parametry ustawiają: funkcję porównującą (func), wartość referencyjną (ref), maskę binarną nakładaną operacją AND na wartość w szablonie i wartość referencyjną (mask). Stałe określające funkcje porównujące zawiera poniższa tabela. Wartość GL_NEVER GL_ALWAYS GL_LESS GL_LEQUAL GL_EQUAL GL_GEQUAL GL_GREATER GL_NOTEQUAL Funkcja porównująca testu szablonu Wynik testu zawsze będzie negatywny Wynik testu zawsze będzie pozytywny Wartość referencyjna < wartość szablonu Wartość referencyjna <= wartość szablonu Wartość referencyjna == wartość szablonu Wartość referencyjna >= wartość szablonu Wartość referencyjna > wartość szablonu Wartość referencyjna!= wartość szablonu Tabela 1. Funkcje porównujące dla testu szablonu Radosław Płoszajczak 3

Sposób wypełniania bufora można określić funkcją: void glstencilop(glenum fail, Glenum zfail, Glenum zpass) Jej parametry określają w jaki sposób mają się zmieniać wartości bufora szablonowego gdy: test szablonowy się nie powiedzie (fail), test szablonowy się powiedzie, a test głębokości nie (zfail) test szablonowy i test głębokości dadzą wynik pozytywny (zpass). Stałe określające możliwe operacje na szablonie zawiera Tabela 2. Wartość GL_KEEP GL_ZERO GL_REPLACE GL_INCR GL_DECR GL_INVERT GL_INCR_WRAP GL_DECR_WRAP Operacja na szablonie Zachowuje aktualną wartość Ustawia wartość na zero Zastępuje aktualną wartość wartością referencyjną określoną w funkcji glstencilfunc() Inkrementuje aktualną wartość Dekrementuje aktualną wartość Odwraca bitowo aktualną wartość Inkrementuje aktualną wartość i w razie przekroczenia maksymalnej wartości przyjmuje wartość zero (tylko w OpenGL 1.4 i nowszym) Dekrementuje aktualną wartość i w razie przekroczenia wartości zero przyjmuje wartość maksymalną (tylko w OpenGL 1.4 i nowszym) Tabela 2. Operacje dokonywane na buforze szablonu IV. Płaszczyzna obcinająca (clip plane) Dla każdego kontekstu renderingu OpenGL zdefiniowana jest frusta czyli ścięty ostrosłup, którego wnętrze ogranicza zakres rysowanej sceny. Składa się ona z 6 płaszczyzn, które wyznaczają jej bryłę. Biblioteka OpenGL umożliwia zdefiniowanie dodatkowych własnych płaszczyzn służących do przycinania rysowanych obiektów niezależnie od ustawień kamery. Ich maksymalna ilość określona jest przez daną implementacje i zazwyczaj wynosi 6. Dopuszczalne maksimum zwraca wywołanie funkcji glgetintegerv(gl_max_clip_planes). Płaszczyznę można zdefiniować za pomocą jej równania w postaci: A x B y C z D=0, gdzie współczynniki A, B i C można interpretować jako współrzędne wektora normalnego [ A, B,C ] tej płaszczyzny. Do określenia płaszczyzny obcinającej w OpenGL służy funkcja: void glclipplane(glenum plane, const GLdouble *equation) Jej parametry są następujące: stała określająca płaszczyznę obcinającą, której równanie jest przekazywane np. GL_CLIP_PLANE0 (plane), wskaźnik do tablicy 4 współczynników równania (equation). Biblioteka OpenGL pozwoli na rysowanie obiektów znajdujących się nad daną płaszczyzną czyli po tej połowie przestrzeni, w której stronę jest skierowany wektor normalny. Włączeniem i wyłączeniem przycinania można sterować za pomocą funkcji glenable() i gldisable() z parametrem GL_CLIP_PLANEi, gdzie i jest numerem płaszczyzny. Działanie płaszczyzny obcinającej demonstruje poniższy rysunek (Rys. 1). Biała siatka to powierzchnia, a strzałka jest jej wektorem normalnym. Przestrzeń podzielona jest na dwie połówki, z których w jednej odbywa się rysowanie, a druga pozostaje nie zmieniona (pusta). Radosław Płoszajczak 4

Rys. 1. Działanie płaszczyzny obcinającej. V. Rysowanie lustra Funkcja RysujLustro() rysująca scenę z lustrem wykonuje swoje zadanie w 3 etapach. 1. Rysowanie szablonu lustra. 2. Rysowanie odbicia. 3. Rysowanie rzeczywistej sceny. Poniżej opisane są dokładnie poszczególne fazy renderingu. 1. Pierwszy etap polega na narysowaniu w buforze szablonowym kształtu szyby. Będzie on potrzebny w kolejnym punkcie podczas rysowania odbicia. Szablon ten posłuży do przycięcia refleksu do kształtu szyby. Rysowanie ma się odbywać tylko w obrębie bufora szablonowego i dlatego należy zablokować bufor kolorów oraz bufor głębokości za co odpowiadają poniższe linie kodu: glcolormask(gl_false, GL_FALSE, GL_FALSE, GL_FALSE); gldisable(gl_depth_test) Następnie należy włączyć test szablonu i wyczyścić stencil buffer domyślną wartością zero. Kolejną czynnością jest ustawienie jego działania tak aby wynik testu szablonu był zawsze pozytywny oraz każdy punkt, który przejdzie test szablonowy i głębokości (co ma miejsce za każdym razem) zastępował wartość w szablonie wartością referencyjną ustawioną na 1: glenable(gl_stencil_test); glclear(gl_stencil_buffer_bit); glstencilfunc(gl_always, 1, 1); glstencilop(gl_keep, GL_KEEP, GL_REPLACE); Radosław Płoszajczak 5

Teraz można narysować kształt szyby. Ponieważ z założenia obiekty odbijane maja się znajdować tylko po jednej stronie lustra narysowany szablon musi być jednostronny. Z tego powodu należy włączyć ukrywanie tylnych ścianek trójkątów (culling). Ostatecznie kod rysujący szablon wygląda następująco: glenable(gl_cull_face); RysujSzybe(); gldisable(gl_cull_face); Zawartość bufora szablonowego po pierwszej fazie rysowania przedstawia Rys. 2. 2. Drugi etap polega na narysowaniu odbicia wewnątrz lustra. W tym celu należy ponownie włączyć bufor kolorów oraz bufor głębokości: glenable(gl_depth_test); glcolormask(gl_true, GL_TRUE, GL_TRUE, GL_TRUE); Zachowanie buforu szablonowego też musi ulec zmianie. Test szablonowy będzie pozytywny tylko wtedy kiedy wartość w jego buforze będzie równa wartości referencyjnej 1. Oznacza to, że zostaną narysowane tylko te fragmenty obiektów, które po rzutowaniu na ekran pokrywają się z wcześniej wygenerowanym szablonem szyby. Należy również zablokować dokonywanie wszelkich zmian w buforze szablonowym. glstencilfunc(gl_equal, 1, 1); glstencilop(gl_keep, GL_KEEP, GL_KEEP); Niepożądanym efektem byłoby wystawanie z powierzchni lustra odbitych obiektów dlatego należy je przyciąć. W tym celu należy utworzyć płaszczyznę obcinającą, której równanie wyznaczają współczynniki zawarte w tablicy: const GLdouble rownanie[] = {0.0f, -1.0f, 0.0f, 0.0f}; Włączenie przycinania i przekazanie powyższych wartości realizuje się następująco: glenable(gl_clip_plane0); glclipplane(gl_clip_plane0, rownanie); W ten sposób rysowanie będzie się odbywać tylko i wyłącznie poniżej płaszczyzny XZ. W omawianym przykładzie układ współrzędnych odbitych obiektów ma odwrócony kierunek osi Y. Należy więc dokonać odpowiedniego przekształcenia, które jest równoważne przeskalowaniu współrzędnej y przez współczynnik -1. Aby nie utracić poprzednich przekształceń konieczne jest również zachowanie aktualnej macierzy model widok poprzez wrzucenie jej na stos. Następnie należy narysować odbijane obiekty. Drugi etap ostatecznie kończy zdjęcie poprzedniej macierzy ze stosu. Całość rysowania odbicia przedstawia poniższy kod: glpushmatrix(); glscalef(1.0f, -1.0f, 1.0f); RysujScene(); glpopmatrix(); W dalszej części funkcji nie będzie już potrzebna powierzchnia obcinająca oraz bufor szablonowy dlatego należy je wyłączyć: gldisable(gl_clip_plane0); gldisable(gl_stencil_test); Wynik działania etapu drugiego można zobaczyć na Rys. 3. 3. Ostatnia faza ma za zadanie wygenerować rzeczywistą scenę. Dlatego konieczne jest kolejne wywołanie funkcji rysującej wszystkie obiekty lecz tym razem w przestrzeni bez odwróconej współrzędnej y. Ponadto na sam koniec należy narysować półprzeźroczystą szybę wykorzystując mieszanie kolorów (blending). Ostatni etap realizuje poniższy kod: Radosław Płoszajczak 6

RysujScene(); glenable(gl_blend); RysujSzybe(); gldisable(gl_blend); Ostateczny rezultat działania funkcji RysujLustro() przedstawia Rys. 4. Jej pełny kod wygląda następująco: void fastcall TForm1::RysujLustro() { const GLdouble rownanie[] = {0.0f, -1.0f, 0.0f, 0.0f}; /* 1. Rysowanie szablonu lustra */ //wyłączenie rysowania w buforze kolorów glcolormask(gl_false, GL_FALSE, GL_FALSE, GL_FALSE); gldisable(gl_depth_test); //wyłaczenie testu głebokości glenable(gl_stencil_test); //właczenie testu szablonu glclear(gl_stencil_buffer_bit); //czyszczenie bufora szablonu glstencilfunc(gl_always, 1, 1); glstencilop(gl_keep, GL_KEEP, GL_REPLACE); //rysowanie kształtu szyby glenable(gl_cull_face); RysujSzybe(); gldisable(gl_cull_face); /* 2. rysowanie odbicia w obrębie szablonu */ glenable(gl_depth_test); glcolormask(gl_true, GL_TRUE, GL_TRUE, GL_TRUE); glstencilfunc(gl_equal, 1, 1); glstencilop(gl_keep, GL_KEEP, GL_KEEP); glenable(gl_clip_plane0); glclipplane(gl_clip_plane0, rownanie); glpushmatrix(); glscalef(1.0f, -1.0f, 1.0f); //odbicie lustrzane osi Y RysujScene(); glpopmatrix(); //wyłaczenie powierzchni obcinającej i bufora szablonu gldisable(gl_clip_plane0); gldisable(gl_stencil_test); /* 3. Rysowanie rzeczywistej sceny */ RysujScene(); } //rysowanie półprzeźroczystej szyby glenable(gl_blend); RysujSzybe(); gldisable(gl_blend); Radosław Płoszajczak 7

Rys. 2. Wynik działania pierwszego etapu rysowania wizualizacja zawartości bufora szablonu. Kolor czarny odpowiada wartości 0, a kolor biały wartości 1. Rys. 3. Zawartość bufora kolorów po drugim etapie rysowania. Odbicie jest przycięte do kształtu szablonu z etapu pierwszego. Rys. 4. Ostateczna scena otrzymana w trzeciej fazie renderowania. Na rezultat poprzednich etapów rysowania zostały nałożone obiekty rzeczywistej sceny oraz półprzezroczysta szyba. Radosław Płoszajczak 8

VI. Uwagi W przypadku zastosowania opisanego algorytmu można się spotkać z pewnymi problemami. Jeden z nich może wystąpić podczas używania świateł podczas rysowania sceny. Fragmenty renderingu, które są odbiciami mogą zostać oświetlone w taki sam sposób jak obiekty rzeczywistej sceny bez uwzględnienia odwrócenia układu współrzędnych. Może to być spowodowane tym, że pozycje świateł zostały określone przed skalowaniem macierzy model widok. Aby temu zapobiec należy ponownie ustawić światła przed rysowaniem odbić oraz przed rysowaniem rzeczywistej sceny. Kolejny problem pojawia się w momencie gdy geometria jest bardzo złożona i rendering długotrwały. Jedną z możliwych w takim wypadku optymalizacji jest zmniejszenie szczegółowości odbicia poprzez np. rysowanie mniejszej ilości obiektów wewnątrz lustra. Radosław Płoszajczak 9