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