Laboratorium nr 3 1/5 Grafika Komputerowa 3D Instrukcja laboratoryjna Temat: Rysowanie prymitywów Przygotował: mgr inż. Maciej Lasota 3 1) Rysowanie prymitywów Podstawową rodziną funkcji wykorzystywanych w bibliotece OpenGL do rysowania różnego rodzaju prymitywów (punktów, odcinków, wielokątów) jest glVertex. Funkcje te służą do rysowania punktu. Istnieje wiele wersji glVertex, różniących się ilością oraz typem przyjmowanych parametrów wejściowych. Liczbę i typ parametrów jakie przyjmują funkcje określa ich nazwa. Najczęściej korzysta się z funkcji glVertex2f oraz glVertex3f. Biblioteka Typ Rdzeń argumentów Liczba argumentów W celu narysowani pojedynczego punktu za pomocą glVertex, należy umieścić ją wewnątrz bloku tworzonego przez parę funkcji glBegin oraz glEnd. Funkcja glBegin informuje bibliotekę OpenGL o rozpoczęciu rysowania grafiki. Przyjmuje ona jeden parametr będący typem rysowanego prymitywu. Typ ten określa się za pomocą parametru mode. void glBegin(GLenum mode) Każde wywołanie funkcji glBegin musi zostać zakończone bezparametrową funkcją glEnd. void glEnd() UWAGA!!! Blok opisany za pomocą funkcji glBegin oraz glEnd nie może być zagnieżdżony w innym bloku. Laboratorium nr 3 2/5 1.1) Rysowanie punktu Punkt jest najprostszym prymitywem graficznym. W celu narysowania punktu jako parametr wejściowy dla glBegin podajemy GL_POINTS. Parametr ten informuje bibliotekę OpenGL, aby narysowała punkt w trójwymiarowej przestrzeni kartezjańskiej. Przykład 1: glBegin(GL_POINTS); glVertex3f(5.0f, 5.0f, 5.0f); glEnd(); Przykład 2: float pozycja[] = {5.0f, 5.0f, 5.0f}; glBegin(GL_POINTS); glVertex3fv(pozycja); glEnd(); Rysowanym punktom oczywiście można ustawić określony rozmiar. Służy do tego celu funkcja. void glPointSize(GLfloat rozmiar) Funkcja przyjmuje tylko jeden parametr, będący wielkością punktu. Podobnie jak większość funkcji OpenGL działa ona na bieżąco. Parametry przez nią ustawione będą oddziaływać na kolejne funkcje tak długo, aż nie wywołamy jej raz jeszcze z innym parametrem. 1.2) Rysowanie linii Rysowanie linii jest bardzo zbliżone do rysowania punktów. Zmienia się tylko stała przekazywana do funkcji glBegin. Stała którą przekazujemy, nazywa się GL_LINES. Jeśli chcemy narysować większą ilość linii, musimy wywołać po dwie funkcje glVertex3f dla każdego wierzchołka. Laboratorium nr 3 3/5 Przykład 3: glBegin(GL_LINES); glVertex3f(-5.0f, 0.0f, 3.0f); glVertex3f(5.0f, 3.0f, 0.0f); glEnd(); Podobnie jak w przypadku punktów możliwe jest ustawienie rozmiarów (szerokości) rysowanej linii za pomocą funkcji glLineWidth. Funkcja przyjmuje tylko jeden parametr, będący szerokości linii. void glLineWidth(GLfloat rozmiar) 1.3) Rysowanie pozostałych prymitywów Tabela poniżej przedstawia pozostałe prymitywy graficzne dostępne w bibliotece OpenGL. Parametr Opis GL_LINE_STRIP Odcinki połączone (łamana) GL_LINE_LOOP Odcinki połączone (łamana zamknięta) GL_TRIANGLES Trójkąty GL_TRIANGLE_STRIP Połączone trójkąty (pasek trójkątów) GL_TRIANGLE_FAN Połączone trójkąty (wachlarz) GL_QUADS Czworokąty GL_QUAD_STRIP Połączone czworokąty GL_POLYGON Wielokąty o dowolnej liczbie wierzchołków 1.4) Kierunek rysowania C C B A A B W celu określenie kierunku rysowania (ściany przedniej i tylnej) wielokąta wykorzystujemy funkcję glFrontFace. Laboratorium nr 3 4/5 Funkcja ta przyjmuje jeden parametr określający kierunek rysowania, zgodny z ruchem wskazówek zegara GL_CW, lub kierunek przeciwny do ruchu wskazówek zegara GL_CCW. 2) Ustawianie kolorów Nadawaniem koloru w bibliotece OpenGL zajmuje się rodzina funkcji glColor. Funkcje z rodziny glColor mogą przyjmować trzy lub cztery parametr. void glColor3f(GLfloat R, GLfloat G, GLfloat B) void glColor4f(GLfloat R, GLfloat G, GLfloat B, GLfloat A) Kolor podaje się w postaci trzech składowych RGB w przypadku funkcji trójparametrowych, natomiast w postaci RGBA w przypadku funkcji czteroparametrowych ostatni parametr jest tzw. współczynnikiem alfa. 3) Czyszczenie bufora kolorów oraz głębi W OpenGL wyróżnimy cztery rodzaj buforów: bufor koloru, głębi, szablonu (wzorca) i akumulacyjny, Najczęściej stosowane są dwa pierwsze czyli bufor kolorów odpowiedzialny za prawidłowe wyświetlanie kolorów oraz bufor głębi odpowiedzialny za poprawne renderowanie obiektów w przestrzeni 3D. Za czyszczenie buforów odpowiedzialna jest funkcja. void glClear(GLbitfield mask) Jako parametr przyjmuje ona stałe określającą rodzaj bufora (GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_ACCUM_BUFFER_BIT, GL_STENCIL_BUFFER_BIT), który chcemy wyczyścić. Bufory można łączyć za pomocą operacji OR . Dodatkowo do czyszczenie bufora kolorów na wybrany kolor służy funkcja void glClearColor(GLfloat R, GLfloat G, GLfloat B, GLfloat A) Przyjmuje ona cztery parametry określające kolor w formacie RGBA na jaki ma zostać wyczyszczony bufor. Laboratorium nr 3 5/5 3) Antialiasing Antialiasing umożliwia wygładzenie ostrych krawędzi punktów lub linii. W OpenGL włączenie antialiasingu polega na aktywowaniu opcji GL_POINT_SMOOTH dla punktów lub GL_LINE_SMOOTH dla linii. Aktywowane odpowiednich funkcji dokonywane jest za pomocą funkcji. void glEnable(GLenum mode) Wyłączenie opcji odbywa się przez wywołanie funkcji. void glDisable(GLenum mode) 4) Cieniowanie W przypadku kolorowania wielokątów, kolory określane są dla wierzchołków, a nie dla wielokątów. O tym, czy wielokąt będzie posiadał jednolity kolor (kolor określony dla ostatniego wierzchołka), czy też kolor będzie się zmieniał płynnie od wierzchołka do wierzchołka, decyduje model cieniowania. Aby ustawić odpowiedni model cieniowania wykorzystywana jest funkcja. void glShadeModel(GLenum mode) Funkcja przyjmuje jeden z dwóch parametrów GL_FLAT określający model cieniowania jednolitego (płaskiego) oraz GL_SMOOTH model cieniowania płynnego przejścia. Cieniowanie jest bardzo ważnym elementem wizualizacji. Wykorzystywane jest m. in. przy obliczeniach związanych ze światłem.