Wizualizacja 3D
glwindowpos2d Funkcja wprowadzona w wersji 1.4 biblioteki OpenGL Funkcja pozwala na ustawienie rastra względem okna, a nie względem macierzy modelu Stosowana podczas pisania tekstów, np.: void DrawString (GLint x, GLint y, char *string) { glwindowpos2i (x,y); int len = strlen (string); for (int i = 0; i < len; i++) glutbitmapcharacter (GLUT_BITMAP_9_BY_15,string [i]); }
Mgła Obok oświetlenia i teksturowania wpływa na realność sceny Włączenie mgły: glenable(gl_fog);
Parametry mgły Funkcje do zmiany parametrów mgły void glfogf (GLenum pname, GLfloat param) void glfogi (GLenum pname, GLint param) void glfogfv (GLenum pname, const GLfloat *params) void glfogiv (GLenum pname, const GLint *params) Gdzie: param rodzaj parmetru mgły pname nazwa parametru Parametry: GL_FOG_MODE (GL_LINEAR, GL_EXP, GL_EXP2) domyślanie GL_EXP GL_FOG_DENSITY (dowolna wartość) domyślnie 1 gęstość mgły GL_FOG_START (dowolna wartość) domyślnie 0 minimalna odległość oddziaływania mgły GL_FOG_END (dowolna wartość) domyślnie 1 maksymalna odległość oddziaływania mgły GL_FOG_INDEX (numer koloru) GL_FOG_COLOR (RGBA) domyślnie (0,0,0,0) GL_FOG_COORD_SRC (GL_FOG_COORD, GL_FRAGMENT_DEPTH) domyślnie GL_FRAGMENT_DEPTH
Mgła (cd) Obliczenia mgły związane są z wyliczeniem współczynnika f, zgodnie z GL_FOG_MODE: GL_LINEAR GL_EXP GL_EXP2
Rodzaje mgły Mgła odległościowa - GL_FOG_COORD_SRC parametr c obliczany jest na podstawie odległości od obserwatora. Intensywność mgły zależy od odległości od obserwatora Mgła objętościowa - GL FOG COORD Dla każdego z wierzchołków określany jest parametr c. Intensywność mgły można kształtować w dowolny sposób przy pomocy funkcji: void glfogcoordf (GLfloat coord); void glfogcoordd (GLdouble coord)
Dodatkowe opcje mgły Funkcja glhint umożliwia sterowanie renderingiem mgły glhint(gl_fog_hint, hintval) hintval może przyjąć następujące wartości: GL_DONT_CARE OpenGL decyduje o renderingu GL_NICEST dobrze wyglądająca mgła. Generowana jest dla każdego piksela GL_FASTEST mgła liczona jest dla każdego wierzchołka
Mieszanie barw Blending to mieszanie barw. Polega na ustaleniu wynikowego koloru piksela jako kombinacji koloru źródłowego i przeznaczenia. Włączenie mieszania barw: glenable (GL_BLEND) Wyłączenie funkcją gldisable(..)
Mieszanie barw (cd) Domyślnie kolor wyliczany jest na podstawie koloru źródła (R s, G s, B s, A s ) oraz koloru docelowego (R d, G d, B d, A d ) Współczynniki S r, S g, S b, S a i D r, D g, D b, D a są współczynnikami mieszania kolorów
Mieszanie barw (cd) Współczynniki S r, S g, S b, S a i D r, D g, D b, D a są obliczane przy pomocy funkcji void glblendfunc (GLenum src, GLenum dst) parametry src i dst określają sposób obliczenia współczynników GL_ZERO - (0, 0, 0, 0) GL_ONE - (1, 1, 1, 1) GL_SRC_COLOR - (Rs, Gs, Bs, As) GL_ONE_MINUS_SRC_COLOR - (1, 1, 1, 1) (Rs,Gs,Bs,As) GL_DST_COLOR - (Rd,Gd,Bd,Ad) GL_ONE_MINUS_DST_COLOR - (1, 1, 1, 1) (Rd,Gd,Bd,Ad) GL_SRC_ALPHA - (As,As,As,As) GL_ONE_MINUS_SRC_ALPHA - (1, 1, 1, 1) (As,As,As,As) GL_DST_ALPHA - (Ad,Ad,Ad,Ad) GL_ONE_MINUS_DST_ALPHA - (1, 1, 1, 1) (Ad,Ad,Ad,Ad) GL_CONSTANT_COLOR - (Rc,Gc,Bc,Ac) GL_ONE_MINUS_CONSTANT_COLOR - (1, 1, 1, 1) (Rc,Gc,Bc,Ac) GL_CONSTANT_ALPHA - (Ac,Ac,Ac,Ac) GL_ONE_MINUS_CONSTANT_ALPHA - (1, 1, 1, 1) (Ac,Ac,Ac,Ac) GL_SRC_ALPHA_SATURATE - (f, f, f, 1), f = min (As, 1 Ad) Domyślne wartości to void glblendfunc (GL_ONE, GL_ZERO )
Bufor akumulacyjny Bufor akumulacyjny pozwala na łączenie kilku obrazów równocześnie. Jest podobny do bufora kolorów. Efekty uzyskiwane dzięki buforowi akumulacyjnemu: rozmycie w ruchu (motion blur) głębia ostrości (depth of field) antyaliasing pełnoekranowy (Full Scene Anti Aliasing) Miękkie cienie (soft shadows) Bufor akumulacyjny nie jest wspierany przez stare karty graficzne Jego użycie związane jest z dużą ilością obliczeń
Bufor akumulacyjny (cd) Sterowanie buforem akumulacyjnym odbywa się przy pomocy funkcji void glaccum(glenum op, GLfloat value) Gdzie Parametry op decyduje o operacji wykonywanej na buforze Value wartość jaka wykorzystywana jest podczas wykonywania tej operacji
Operacje na buforze akumulacyjnym GL_ACCUM dodawanie do wartości bufora GL_LOAD zapisanie nowej wartości GL_RETURN kopiowanie z bufora akumulacyjnego do bufora kolorów
Operacje na buforze akumulacyjnym GL_MULT mnożenie wartości zawartych w buforze przez wartość value GL_ADD dodawanie wartości value do wartości w buforze akumulacyjnym
Bufor akumulacyjny (cd) Czyszczenie bufora akumulacyjnego void glclear(gl_accum_buffer_bit) Kolor czyszczenia bufora akumulacyjnego void glclearaccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) Inicjalizacja bufora w przypadku GLUT polega na dodaniu GLUT_ACCUM po wywołaniu glutinitdisplaymode
Antyaliasing Antyaliasing (patrz wykład 1) wygładzanie krawędzi Techniki: Uzupełnienie o dodatkowe piksele brzegów figury Rysowanie obiektów w rozdzielczości większej niż docelowa i przeskalowanie
Jakość renderingu Funkcja zmieniająca jakości reneringu: void glhint(glenum target, GLenum mode) Gdzie target element renderingu GL_FOG_HINT - jakość mgły; GL_FASTES lub GL_NICEST, GL_LINE_SMOOTH_HINT - antyaliasing linii, GL_PERSPECTIVE_CORRECTION_HINT - korekcja perspektywy przy renderingu tekstur, GL_POINT_SMOOTH_HINT - antyaliasing punktów, GL_POLYGON_SMOOTH_HINT - antyaliasing wielokątów, GL_GENERATE_MIPMAP_HINT - generowanie mipmap, GL_TEXTURE_COMPRESSION_HINT - kompresja tekstur, mode jakość GL_FASTEST szybkość GL_NICEST jakość GL_DONT_CARE domyślne ustawienia
Antyaliasing punktów Włączenie antyaliasingu punktów: glenable(gl_point_smooth) Dodatkowo należy włączyć mieszanie kolorów glblendfunc(gl_src_alpha,gl_one_minus_s RC_ALPHA)
Antyaliasing linii Włączenie antyaliasingu glenable(gl_line_smooth) Dodatkowo należy włączyć mieszanie kolorów glblendfunc(gl_src_alpha,gl_one_minus_s RC_ALPHA)
Antyaliasing wielokątów Z użyciem bufora akumulacyjnego Scena jest rysowana wielokrotnie z niewielkim przesunięciem. Następnie składowe są skalowane i sumowane w buforze akumulacyjnym Wada: duża ilość obliczeń Wielopróbkowanie (multisampling) Polega na dodaniu dodatkowego bufora, niezależnego do bufora koloru w celu wyliczenia wartości pikseli na podstawie przyległych sąsiadów. Włączenie: glenable(gl_multisampling)
Pełny ekran Biblioteka GLUT umożliwia uruchomienie aplikacji w trybie pełnego ekranu Funkcja ustawiające rozdzielczość ekranu, liczbę bitów oraz częstotliwość odświeżania ekranu glutgamemodestring( "640x480:16@60" ); Włączenie trybu pełnego ekranu: glutentergamemode(); Wyłączenie trybu pełnego ekranu glutleavegamemode();
Pełny ekran - przykład int main(int argc, char * argv[]) { glutinit( &argc, argv ); glutinitdisplaymode( GLUT_RGBA GLUT_DOUBLE GLUT_DEPTH ); glutgamemodestring( "640x480:16@60" ); glutentergamemode(); glutdisplayfunc( display ); glutkeyboardfunc( keyboard ); glutmainloop(); } return 0;