Rysowanie prymitywów

Transkrypt

Rysowanie prymitywów
Laboratorium nr 3
Instrukcja
laboratoryjna
3
1)
1/5
Grafika Komputerowa 3D
Temat: Rysowanie prymitywów
Przygotował: mgr inż. Maciej Lasota
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
argumentów
Rdzeń
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
1.1)
2/5
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
GL_LINE_LOOP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_QUADS
GL_QUAD_STRIP
GL_POLYGON
Odcinki połączone (łamana)
Odcinki połączone (łamana zamknięta)
Trójkąty
Połączone trójkąty (pasek trójkątów)
Połączone trójkąty (wachlarz)
Czworokąty
Połączone czworokąty
Wielokąty o dowolnej liczbie wierzchołków
1.4)
Kierunek rysowania
C
B
C
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
(GL_COLOR_BUFFER_BIT,
przyjmuje
ona
stałe
określającą
GL_DEPTH_BUFFER_BIT,
rodzaj
bufora
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
3)
5/5
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.