Lekce 8

Lekce 8 - Blending

DalÜφ typ specißlnφho efektu v OpenGL je blending, neboli pr∙hlednost. Kombinace pixel∙ je urΦena alfa hodnotou barvy a pou₧itou funkcφ. Nab²vß-li alfa 0.0f, materißl zpr∙hlednφ, hodnota 1.0f p°inßÜφ prav² opak.

Rovnice blendingu
Nemßte-li rßdi matematiku a chcete vid∞t jak se pou₧φvß pr∙hlednost prakticky, p°eskoΦte tuto Φßst. Pro n∞koho m∙₧e b²t nepochopitelnß.

(Rs Sr + Rd Dr, Gs Sg + Gd Dg, Bs Sb + Bd Db, As Sa + Ad Da)

OpenGL vypoΦφtß v²sledek blendingu dvou pixel∙ z p°edchozφ rovnice. 's' a 'r' p°edstavujφ zdrojov² a cφlov² pixel. 'S' a 'D' jsou ΦinitelΘ blendingu. Tyto hodnoty urΦujφ jak moc budou pixely pr∙hlednΘ. V∞tÜina obyΦejn²ch hodnot pro S a D jsou (As, As, As, As) (AKA zdrojovß alfa) pro S a (1, 1, 1, 1) - (As, As, As, As) (AKA jedna minus zdrojovß alfa) pro D. Rovnice bude vypadat takto:

(Rs As + Rd (1 - As), Gs As + Gd (1 - As), Bs As + Bs (1 - As), As As + Ad (1 - As))

#include <windows.h>// HlaviΦkov² soubor pro Windows

#include <stdio.h>// HlaviΦkov² soubor pro standardnφ vstup/v²stup

#include <gl\gl.h>// HlaviΦkov² soubor pro OpenGL32 knihovnu

#include <gl\glu.h>// HlaviΦkov² soubor pro Glu32 knihovnu

#include <gl\glaux.h>// HlaviΦkov² soubor pro Glaux knihovnu

HDC hDC = NULL;// Privßtnφ GDI Device Context

HGLRC hRC = NULL;// Trval² Rendering Context

HWND hWnd = NULL;// Obsahuje Handle naÜeho okna

HINSTANCE hInstance;// Obsahuje instanci aplikace

bool keys[256];// Pole pro uklßdßnφ vstupu z klßvesnice

bool active = TRUE;// Ponese informaci o tom, zda je okno aktivnφ

bool fullscreen = TRUE;// Ponese informaci o tom, zda je program ve fullscreenu

Blending se zapφnß stejn∞ jako vÜechno ostatnφ. Potom nastavφme rovnici a vypneme depth buffer, jinak by se objekty za nevykreslily. To nenφ sprßvnß cesta k blendingu, ale ve v∞tÜin∞ jednoduch²ch projekt∙ to bude fungovat. Sprßvnß cesta k vykreslenφ pr∙hledn²ch (alfa < 1.0) polygon∙ po vykreslenφ scΘny je obrßcenφ depth bufferu (nejvzdßlen∞jÜφ prvnφ). Jsou tu dva ·daje o blendingu dvou polygon∙ (1 a 2) kterΘ v odliÜnΘm po°adφ dajφ odliÜn² v²sledek, nap°.: uva₧ujme polygon 1 jako vzdßlen∞jÜφ od pozorovatele, sprßvn∞ by m∞l b²t tedy vykreslen prvnφ polygon 2 a potom polygon 1. Kdy₧ se na to podφvßte, jako ve skuteΦnosti, vÜechno sv∞tlo se mφsφ za t∞mito dv∞ma polygony (jsou-li pr∙hlednΘ), musφ se vykreslit polygon 2 prvnφ a potom polygon 1. Rad∞ji °a∩te pr∙hlednΘ objekty podle hloubky a kreslete je a₧ po vykreslenφ celΘ scΘny se zapnut²m depth bufferem. Jinak m∙₧ete dostat ÜpatnΘ v²sledky. Vφm ₧e je to t∞₧kΘ, ale je to jedinß sprßvnß cesta. Pou₧ijeme k≤d z lekce 7.

bool light;// Sv∞tlo ON/OFF

bool blend;// Blending OFF/ON

bool lp;// Stisknuto L?

bool fp;// Stisknuto F?

bool bp;// Stisknuto B?

GLfloat xrot;// X Rotace

GLfloat yrot;// Y Rotace

GLfloat xspeed;// Rychlost x rotace

GLfloat yspeed;// Rychlost y rotace

GLfloat z=-5.0f;// Hloubka v obrazovce

GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };// Okolnφ sv∞tlo

GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };// P°φmΘ sv∞tlo

GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };// Pozice sv∞tla

GLuint filter;// Pou₧it² texturov² filtr

GLuint texture[3];// Uklßdß 3 textury

Posuneme se dol∙ na LoadGLTextures() a zm∞nφme jmΘno textury.

// Funkce LoadGLTextures()

if(TextureImage[0]=LoadBMP("Data/Glass.bmp"))// Loading bitmapy

DalÜφ °ßdky p°idßme do InitGL(). Nastavenφ jimi objekty na pln² jas a 50% alfu (pr∙hlednost). To znamenß, ₧e kdy₧ bude blending zapnut, objekt bude z 50% pr∙hledn². Alfa hodnota 0.0 je ·plnß pr∙hlednost, 1.0 je opak. Druh² °ßdek nastavφ typ blendingu.

// Funkce InitGL()

glColor4f(1.0f,1.0f,1.0f,0.5f);// Pln² jas, 50% alfa

glBlendFunc(GL_SRC_ALPHA,GL_ONE);// Funkce blendingu pro pr∙svitnost zalo₧enß na hodnot∞ alfa

Podφvejte se na nßsledujφcφ k≤d, je umφst∞n na konci lekce ve funkci WinMain().

// Funkce WinMain()

if (keys['B'] && !bp)// Klßvesa B - zapne blending

{

bp=TRUE;

blend = !blend;

if(blend)

{

glEnable(GL_BLEND);// Zapne blending

glDisable(GL_DEPTH_TEST);// Vypne hloubkovΘ testovßnφ

}

else

{

glDisable(GL_BLEND);// Vypne blending

glEnable(GL_DEPTH_TEST);// Zapne hloubkovΘ testovßnφ

}

}

if (!keys['B'])// Uvoln∞nφ B

{

bp=FALSE;

}

Nenφ to jednoduchΘ? StaΦφ zapnout blending, vypnout hloubkovΘ testovßnφ a zavolat funkci glColor4f(r,g,b,a) - vÜe, co nakreslφme bude pr∙hlednΘ.

Jak ale nastavφme barvu pou₧itou v textu°e? JednoduÜe, v modulated texture modu, ka₧d² pixel mapovan² texturou je nßsobkem aktußlnφ barvy. Kdy₧ kreslenß barva je (0.5, 0.6, 0.4), nßsobφme barvou a p°edßme (0.5, 0.6, 0.4, 0.2) (alfa je 1.0, nenφ-li urΦen).

Alfa z textury
Alfa hodnota pou₧itß pro pr∙hlednost m∙₧e b²t p°eΦtena z textury pouze jako barva. To se d∞lß tak, ₧e se p°edß alfa do obrßzku p°i nahrßvßnφ a potΘ se ve funkci glTexImage2D() pou₧ije pro barevn² formßt GL_RGBA.

napsal: Tom Stanis
p°elo₧il: Ji°φ Rajsk² - RAJSOFT junior

ZdrojovΘ k≤dy

Lekce 8

<<< Lekce 7 | Lekce 9 >>>