Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie grafiki 3D Materiały, kolory i antyaliasing Materiały Mieszanie kolorów Efekt mgły Antyaliasing.

Podobne prezentacje


Prezentacja na temat: "Programowanie grafiki 3D Materiały, kolory i antyaliasing Materiały Mieszanie kolorów Efekt mgły Antyaliasing."— Zapis prezentacji:

1 Programowanie grafiki 3D Materiały, kolory i antyaliasing Materiały Mieszanie kolorów Efekt mgły Antyaliasing

2 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) face Parametr face ustala, której strony wielokąta dotyczy modyfikowana własność i może GL_FRONTGL_BACK GL_FRONT_AND_BACK 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) modeGL_EMISSIONGL_DIFFUSEGL_SPECULAR Parametr mode może przyjmować wartości: GL_EMISSION, GL_DIFFUSE, GL_SPECULAR, GL_AMBIENT_AND_DIFFUSE GL_AMBIENT_AND_DIFFUSE. Ich znaczenie opisano w tabeli na następnym slajdzie.

3 Materiały pnameznaczenieGL_AMBIENTSkładowe RGBA określające stopień odbicia światła otaczającego. GL_DIFFUSESkładowe RGBA określające stopień rozproszenia światła rozproszonego. GL_AMBIENT_AND_DIFFUSEWspólna wartość dla obydwu powyższych. GL_SPECULARSkładowe RGBA określające stopień odbicia światła odbitego. GL_SHININESSWartość z zakresu określająca stopień połyskliwości. GL_EMISSIONSkładowe określające stopień emisji światła. Światło pochodzące z takiego obiektu nie oświetla innych obiektów. GL_COLOR_INDEXESUżywane w indeksowanym trybie kolorów.

4 Materiały pnamewartości domyślneGL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE GL_SPECULAR(0,0,0,1) GL_SHININESS0 GL_EMISSION GL_COLOR_INDEXES(0,0,1)

5 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) Chromzłotoczarny plastikGL_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

6 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_AMBIENTGL_DIFFUSEGL_SPECULAR 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 GL_DIFFUSE metale zazwyczaj mają duże wartości GL_DIFFUSE i wyraźnie mniejsze GL_AMBIENT GL_SPECULAR 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_AMBIENTGL_DIFFUSE GL_AMBIENT i GL_DIFFUSE przypominają metal GL_SPECULAR GL_SPECULAR są raczej podobne do dielektryków inne materiały

7 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: (R S, G S, B S, A S ) - oznaczają składowe koloru źródłowego (R D, G D, B D, A D ) - 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

8 Mieszanie kolorów GL_FUNC_ADDGL_MINGL_FUNC_SUBTRACTGL_MAX GL_FUNC_REVERSE_SUBTRACTGL_LOGIC_OP

9 GL_FUNC_ADDGL_MINGL_FUNC_SUBTRACTGL_MAX GL_FUNC_REVERSE_SUBTRACTGL_LOGIC_OP Użycie operacji logicznych musi zostać poprzedzone ich włączeniem:glEnable(GL_COLOR_LOGIC_OP); Użycie operacji logicznych musi zostać poprzedzone ich włączeniem:glEnable(GL_COLOR_LOGIC_OP);

10 Mieszanie kolorów Wyboru operacji logicznej dokonujemy: void glLogicOp(GLenum opcode); opcodeoperacjaopcodeoperacjaGL_CLEAR0GL_ORSvD GL_SET1GL_NOR~(SVD) GL_COPYSGL_XORSxD GL_COPY_INVERTED~SGL_EQUIV~(SxD) GL_NOOPDGL_AND_REVERSES^(~D) GL_INVERT~DGL_AND_INVERTED(~S)^D GL_ANDS^DGL_OR_REVERSESv(~D) GL_NAND~(S^D)GL_OR_INVERTED(~S)vD S - oznaczają składowe koloru źródłowego, a D - składowe koloru docelowego

11 Mieszanie kolorów Współczynniki mieszania kolorów wybieramy funkcją: void glBlendFunc(GLenum src, GLenum dst); srcdst 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); 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);

12 Mieszanie kolorów parametrwspółczynnik mieszania GL_ZERO(0, 0, 0, 0) GL_ONE(1, 1, 1, 1) GL_SRC_COLOR(R S, G S, B S, A S ) GL_ONE_MINUS_SRC_COLOR(1-R S, 1-G S, 1-B S, 1-A S ) GL_DST_COLOR(R D, G D, B D, A D ) GL_ONE_MINUS_DST_COLOR(1-R D, 1-G D, 1-B D, 1-A D ) GL_SRC_ALPHA(A S, A S, A S, A S ) GL_ONE_MINUS_SRC_ALPHA(1-A S, 1-A S, 1-A S, 1-A S ) GL_DST_ALPHA(A D, A D, A D, A D ) GL_ONE_MINUS_DST_ALPHA(1-A D, 1-A D, 1-A D, 1-A D ) GL_CONSTANT_COLOR(R W, G W, B W, A W ) GL_ONE_MINUS_CONSTANT_COLOR(1-R W, 1-G W, 1-B W, 1-A W ) GL_CONSTANT_ALPHA(A W, A W, A W, A W ) GL_ONE_MINUS_CONSTANT_ALPHA(1-A W, 1-A W, 1-A W, 1-A W ) GL_SRC_ALPHA_SATURATE *(f, f, f, 1) gdzie f = min(A S, 1-A D ) * może być użyty tylko jako współczynnik mieszania koloru źródłowego

13 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); reffunc 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);

14 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_MODEGL_LINEARGL_EXPGL_EXP2 GL_FOG_MODE mogący przyjmować wartości: GL_LINEAR, GL_EXP, GL_EXP2 GL_FOG_COORD_SRCGL_FOG_COORD GL_FOG_COORD_SRC mogący przyjmować wartości: GL_FOG_COORD, GL_FRAGMENT_DEPTH GL_FOG_DENSITY GL_FOG_STARTGL_FOG_END GL_FOG_START i GL_FOG_END GL_FOG_COLORGL_FOG_INDEX GL_FOG_COLOR (lub w trybie indeksowanym GL_FOG_INDEX)

15 Efekt mgły Składowe koloru wyliczane są według równania: C=f·C S +(1-f)·C Fog. Przy czym współczynnik f zależy od wybranego trybu symulacji mgły i jest wyliczany w następujący sposób: trybsposób wyliczaniaGL_LINEAR (zwykła mgła) GL_EXP (gęsta mgła lub chmury) GL_EXP2 (dym) GL_FOG_COORD_SRCGL_FRAGMENT_DEPTHz 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ą).

16 Efekt mgły GL_FOG_COORD_SRCGL_FOG_COORD 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); GL_FOG_HINT pierwszym argumentem musi być GL_FOG_HINT, drugi natomiast może przyjmować wartość: GL_FASTEST GL_FASTEST, wtedy mgła liczona jest dla każdego wierzchołka lub GL_NICEST GL_NICEST wówczas mgła będzie liczona dla każdego punktu

17 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. GL_ALPHA_BITS 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

18 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);

19 test


Pobierz ppt "Programowanie grafiki 3D Materiały, kolory i antyaliasing Materiały Mieszanie kolorów Efekt mgły Antyaliasing."

Podobne prezentacje


Reklamy Google