190 likes | 341 Views
Programowanie grafiki 3D Materiały, kolory i antyaliasing. Materiały 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)
E N D
Programowanie grafiki 3D Materiały, kolory i antyaliasing • Materiały • 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 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)
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 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); 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);
Mieszanie kolorów * 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: 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);