Programowanie grafiki 3D Materiały, kolory i antyaliasing Mieszanie kolorów Efekt mgły Antyaliasing
Materiały Właściwości materiałów ustala się wywołując funkcje: void glMaterialf(GLenum face, GLenump name, GLfloat param) void glMateriali(GLenum face, GLenump name, GLint param) void glMaterialfv(GLenum face, GLenump name, const GLfloat *params) void glMaterialiv(GLenum face, GLenump name, const GLint *params) Parametr face ustala, której strony wielokąta dotyczy modyfikowana własność i może przyjmować wartości: GL_FRONT, GL_BACK i GL_FRONT_AND_BACK. Poszczególne własności materiałów mogą być definiowane niezależnie dla każdego wierzchołka na podstawie koloru wierzchołka. Jest to tzw. śledzenie kolorów. Ustalenia, która własność będzie związana z kolorem wierzchołków dokonujemy w funkcji: void glColorMaterial(GLenum face, GLenum mode) Parametr mode może przyjmować wartości: GL_EMISSION, GL_DIFFUSE, GL_SPECULAR, GL_AMBIENT_AND_DIFFUSE. Ich znaczenie opisano w tabeli na następnym slajdzie.
Materiały pname znaczenie GL_AMBIENT Składowe RGBA określające stopień odbicia światła otaczającego. GL_DIFFUSE Składowe RGBA określające stopień rozproszenia światła rozproszonego. GL_AMBIENT_AND_DIFFUSE Wspólna wartość dla obydwu powyższych. GL_SPECULAR Składowe RGBA określające stopień odbicia światła odbitego. GL_SHININESS Wartość z zakresu <0;1> określająca stopień połyskliwości. GL_EMISSION Składowe określające stopień emisji światła. Światło pochodzące z takiego obiektu nie oświetla innych obiektów. GL_COLOR_INDEXES Używane w indeksowanym trybie kolorów.
Materiały pname wartości domyślne GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE GL_SPECULAR (0,0,0,1) GL_SHININESS GL_EMISSION GL_COLOR_INDEXES (0,0,1)
Materiały Odczyt własności bieżącego materiału umożliwiają funkcje: void glGetMaterialfv (GLenum face, GLenump name, GLfloat *params) void glGetMaterialv (GLenum face, GLenump name, GLint *params) Chrom złoto czarny plastik GL_AMBIENT (0.25, 0.25, 0.25) (0.25, 0.20, 0.07) (0.00, 0.00, 0.00) GL_DIFFUSE (0.40, 0.40, 0.40) (0.75, 0.61, 0.23) (0.01, 0.01, 0.01) GL_SPECULAR (0.77, 0.77, 0.77) (0.63, 0.56, 0.37) (0.50, 0.50, 0.50) GL_SHININESS 76.8 52.2 32.0
Materiały Kilka porad jak tworzyć własne materiały: dielektryki stosunkowo niska zdolność odbijania światła i niezależna od długości fali niektóre dielektryki są przezroczyste GL_AMBIENT, GL_DIFFUSE i GL_SPECULAR mają zazwyczaj podobne wartości dielektryki sproszkowane zazwyczaj wydają się szare metale są nieprzezroczyste i silnie odbijają światło zazwyczaj kolory światła odbitego i rozpraszanego są dla nich takie same różne metale w różny sposób odbijają różne długości fali metale zazwyczaj mają duże wartości GL_DIFFUSE i wyraźnie mniejsze GL_AMBIENT GL_SPECULAR zależy od konkretnego metalu, jednak najsilniejsza składowa raczej nie powinna być mniejsza niż 0.5 materiały kompozytowe plastiki, farby, pigmenty –własności pośrednie między metalami i dielektrykami GL_AMBIENT i GL_DIFFUSE przypominają metal GL_SPECULAR są raczej podobne do dielektryków inne materiały
Mieszanie kolorów Standartowo biblioteka OpenGL stawiając punkt w buforze koloru zastępuje kolor wcześniej tam obecny nowym. Włączając tryb mieszania kolorów (ang. alpha blending) funkcją: glEnable(GL_BLEND); możemy sprawić, że kolory nie będą zastępowane, tylko mieszane w określony sposób. Tryb mieszania kolorów ustalamy funkcją (dostępna jako rozszerzenie ARB): void glBlendEquation(GLenummode); Dodatkowo można zdefiniować inny sposób mieszania dla składowych RGB i inny dla kanału alfa: void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha); Niech: (RS, GS, BS, AS) - oznaczają składowe koloru źródłowego (RD, GD, BD, AD) - oznaczają składowe koloru docelowego (αR, αG, αB, αA) - oznaczają współczynniki mieszania koloru źródłowego (βR, β G, β B, β A) - oznaczają współczynniki mieszania koloru docelowego
Mieszanie kolorów GL_FUNC_ADD GL_MIN GL_FUNC_SUBTRACT GL_MAX GL_FUNC_REVERSE_SUBTRACT GL_LOGIC_OP
Mieszanie kolorów GL_FUNC_ADD GL_MIN GL_FUNC_SUBTRACT GL_MAX GL_FUNC_REVERSE_SUBTRACT GL_LOGIC_OP Użycie operacji logicznych musi zostać poprzedzone ich włączeniem: glEnable(GL_COLOR_LOGIC_OP);
Mieszanie kolorów Wyboru operacji logicznej dokonujemy: void glLogicOp(GLenum opcode); opcode operacja GL_CLEAR GL_OR SvD GL_SET 1 GL_NOR ~(SVD) GL_COPY S GL_XOR SxD GL_COPY_INVERTED ~S GL_EQUIV ~(SxD) GL_NOOP D GL_AND_REVERSE S^(~D) GL_INVERT ~D GL_AND_INVERTED (~S)^D GL_AND S^D GL_OR_REVERSE Sv(~D) GL_NAND ~(S^D) GL_OR_INVERTED (~S)vD S - oznaczają składowe koloru źródłowego, a D - składowe koloru docelowego
Mieszanie kolorów Współczynniki mieszania kolorów wybieramy funkcją: void glBlendFunc(GLenum src, GLenum dst); gdzie src odpowiada (αR, αG, αB, αA) , a dst odpowiada (βR, β G, β B, β A) . Można przydzielić inne współczynniki do kanałów RGB i inne do kanału alfa: void glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); Przy niektórych współczynnikach można używać własnych ustawień koloru (RW, GW, BW, AW). Wartości składowych tego koloru ustawiamy funkcją : void glBlendColor(GLclampf Rw, GLclampf Gw, GLclampf Bw, GLclampf Aw);
współczynnik mieszania Mieszanie kolorów parametr współczynnik mieszania 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-RS, 1-GS, 1-BS, 1-AS) GL_DST_COLOR (RD, GD, BD, AD) GL_ONE_MINUS_DST_COLOR (1-RD, 1-GD, 1-BD, 1-AD) GL_SRC_ALPHA (AS, AS, AS, AS) GL_ONE_MINUS_SRC_ALPHA (1-AS, 1-AS, 1-AS, 1-AS) GL_DST_ALPHA (AD, AD, AD, AD) GL_ONE_MINUS_DST_ALPHA (1-AD, 1-AD, 1-AD, 1-AD) GL_CONSTANT_COLOR (RW, GW, BW, AW) GL_ONE_MINUS_CONSTANT_COLOR (1-RW, 1-GW, 1-BW, 1-AW) GL_CONSTANT_ALPHA (AW, AW, AW, AW) GL_ONE_MINUS_CONSTANT_ALPHA (1-AW, 1-AW, 1-AW, 1-AW) GL_SRC_ALPHA_SATURATE * (f, f, f, 1) gdzie f = min(AS, 1-AD) * może być użyty tylko jako współczynnik mieszania koloru źródłowego
Mieszanie kolorów Mieszanie kolorów można ograniczyć tylko do tych punktów, które spełniają określony warunek na kanale alfa. Rodzaj testu na kanale alfa ustawiany jest funkcją: void glAlphaFunc(GLenum func, GLclampf ref); gdzie ref jest wartością w stosunku do której wykonywany będzie test kanału alfa , a func określa rodzaj wykonywanego testu i może przyjmować jedną z wartości: GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS Testowanie kanału alfa należy włączyć: void glEnable(GL_ALPHA_TEST);
Efekt mgły Efekt mgły polega na specyficznym mieszaniu kolorów z bufora koloru z kolorem mgły według ustalonego równania „gęstnienia” mgły. Przed użyciem efekt mgły należy włączyć: glEnable(GL_FOG); Parametry mgły ustalamy jedną z funkcji: 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); Parametry określające mgłę to: • GL_FOG_MODE mogący przyjmować wartości: GL_LINEAR, GL_EXP, GL_EXP2 • GL_FOG_COORD_SRC mogący przyjmować wartości: GL_FOG_COORD, GL_FRAGMENT_DEPTH • GL_FOG_DENSITY • GL_FOG_START i GL_FOG_END • GL_FOG_COLOR (lub w trybie indeksowanym GL_FOG_INDEX)
Efekt mgły Składowe koloru wyliczane są według równania: C=f·CS+(1-f)·CFog. Przy czym współczynnik f zależy od wybranego trybu symulacji mgły i jest wyliczany w następujący sposób: tryb sposób wyliczania GL_LINEAR (zwykła mgła) GL_EXP (gęsta mgła lub chmury) GL_EXP2 (dym) Gdy GL_FOG_COORD_SRC jest ustawiony na GL_FRAGMENT_DEPTH zmienna z zależy od odległości danego fragmentu od obserwatora, a generowana wówczas mgła nazywana jest mgłą głębokościową (albo odległościową).
Efekt mgły Jeśli GL_FOG_COORD_SRC ustawione jest na GL_FOG_COORD, wówczas parametry mgły mogą być ustalone niezależnie dla każdego wierzchołka prymitywu. Generowana wówczas mgła nazywana jest mgłą objętościową. Współrzędne mgły dla poszczególnych wierzchołków definiują funkcje: void glFogCoordf(GLfloat coord); void glFogCoordd(GLdouble coord); void glFogCoordfv(const GLfloat *coord); void glFogCoorddv(const GLdouble *coord); Jakość generowanej mgły określamy wywołując funkcję: void glHint(GLenum target, GLenum mode); pierwszym argumentem musi być GL_FOG_HINT, drugi natomiast może przyjmować wartość: GL_FASTEST, wtedy mgła liczona jest dla każdego wierzchołka lub GL_NICEST wówczas mgła będzie liczona dla każdego punktu
Antyaliasing Podstawowy antyaliasing w OpenGL możemy niezależnie włączać i wyłączać przy rysowaniu punktów, linii oraz wielokątów: glEnable (GL_POINT_SMOOTH); glEnable (GL_LINE_SMOOTH); glEnable (GL_POLYGON_SMOOTH);* W pierwszych dwóch przypadkach należy włączyć mieszanie kolorów w trybie: glBlendFunction(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); W trzecim przypadku tryb mieszania kolorów powinien wyglądać następująco: glBlendFunction(GL_SRC_ALPHA_SATURATE,GL_ONE); W tym ostatnim przypadku, przy inicjalizacji okna OpenGL należy również włączyć kanał alfa w buforze ramki: glutInitDisplayMode(*|GLUT_ALPHA); Implementacja OpenGL może, ale nie musi udostępniać kanał alfa w buforze ramki. Jeśli zmienna stanu GL_ALPHA_BITS jest równa zero to oznacza, że kanał alfa nie jest dostępny. *ta ostatnia operacja dotyczy jedynie rysowania wypełnionych wielokątów, w przypadku rysowania punktami lub liniami wystarczają dwie poprzednie funkcje
Antyaliasing Włączenie antyaliasingu metodą nadpróbkowania (ang. oversampling): glEnable(GL_MULTISAMPLE); całkowicie dezaktywuje podstawowe metody antyaliasingu dla punktów, linii i wielokątów. Wykorzystanie tej techniki wymaga wcześniej dołączenia buforu nadpróbkowywania do buforu ramki: glutInitDisplayMode(*|GLUT_MULTISAMPLE);
test