Bufor akumulacyjny

Transkrypt

Bufor akumulacyjny
Laboratorium nr 5
Instrukcja
Laboratoryjna
5
1/3
Programowanie Grafiki Komputerowej
Temat: Bufor akumulacyjny
Przygotował: mgr inż. Grzegorz Pawiński
1) Bufor akumulacyjny
Bufor akumulacyjny umożliwia nakładanie na siebie kilku obrazów w celu uzyskania
efektów specjalnych, tj. Rozmycie w ruchu, głębia ostrości, miękkie cienie, wygładzanie krawędzi
itp. Podobnie jak bufor koloru, przechowuje informacje o składowych koloru RGBA.
1.1)
Kontrola bufora akumulacyjnego
Przed korzystaniem z bufora akumulacyjnego należy najpierw go uaktywnić. Aktywacja
polega na dodaniu do wywołania funkcji glutInitDisplayMode() stałej GLUT_ACCUM. Kontrolę
nad buforem akumulacyjnym umożliwia funkcja:
void glAccum(GLenum op, Glfloat value);
Parametr op
Opis operacji
GL_ACCUM
RGBAa = RGBAa value⋅RGBAc
GL_LOAD
RGBA a =value⋅RGBA c
GL_RETURN
RGBA c =value⋅RGBA a
GL_MULT
RGBA a =value⋅RGBA a
GL_ADD
RGBA a =value RGBAa
gdzie:
RGBA a - składowe koloru RGBA bufora akumulacyjnego,
RGBA c - składowe koloru RGBA bufora koloru
1.2)
Czyszczenie bufora akumulacyjnego
Zawartość bufora akumulacyjnego można czyścić, podobnie jak zawartość innych buforów,
używając funkcji glClear() z parametrem GL_ACCUM_BUFFER_BIT. Domyślnie wypełniany jest
Laboratorium nr 5
2/3
zerami. Ustawienie koloru, na jaki bufor akumulacyjny zostanie wyczyszczony umożliwia funkcja
void glClearAccum(GLfloat red,GLfloat green,GLfloat blue,GLfloat alpha);
1.3)
Przykłady
1.3.1)
Rozmycie
//narysowanie obiektu 3D //pomniejszenie udziału kolorów z bieżącej zawartości bufora
glAccum (GL_MULT,0.9);
// nałożenie aktualnie rysowanego obiektu z odpowiednią wagą
// suma współczynników funkcji glAccum() powinna być równa 1 glAccum (GL_ACCUM,0.1);
// skopiowanie otrzymanego obrazu do bufora koloru
glAccum (GL_RETURN,1.0);
1.3.2)
Poruszenie
// załadowanie pierwszego obrazu
glAccum (GL_LOAD,0.5);
// obrócenie obiektu 3D
glRotatef (­2.0,0.0,1.0,0.0);
// narysowanie obiektu 3D
// dodanie do bufora akumulacyjnego obróconego obiektu (ślad)
glAccum (GL_ACCUM,0.25);
// dalsze obrócenie obiektu 3D
glRotatef (­2.0,0.0,1.0,0.0);
// narysowanie obiektu 3D
// dodanie do bufora akumulacyjnego obróconego obiektu (ślad)
// suma współczynników funkcji glAccum() powinna być równa 1
glAccum (GL_ACCUM,0.25); // skopiowanie otrzymanego obrazu do bufora koloru
glAccum (GL_RETURN,1.0);
Laboratorium nr 5
1.3.3)
Głębia ostrości
// czyszczenie bufora akumulacyjnego
glClear (GL_ACCUM_BUFFER_BIT);
// wyświetlenie poruszonych obiektów
for(int y = ­1; y < 2; y++)
for(int x = ­1; x < 2; x++)
{
// współczynnik zmiany perspektywy
GLfloat dx = x * 0.01;
GLfloat dy = y * 0.01;
//** ustawienie perspektywy **//
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
//zmiana kąta patrzenia według współczynników
glFrustum (left+dx,right+dx,bottom+dy,top+dy,near,far);
//** ustawienie perspektywy **//
//** rysowanie sceny **//
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
glTranslatef (0,0,­(near+far)/2);
// niewielkie poruszenie obiektu w tle
glTranslatef (x*0.02,y*0.02,0.0);
//narysowanie obiektu 3D
// dodanie obiektu do bufora akumulacyjnego
// suma współczynników funkcji glAccum() powinna być // równa 1
glAccum (GL_ACCUM,1.0/9);
//** rysowanie sceny **//
}
// skopiowanie otrzymanego obrazu do bufora koloru
glAccum (GL_RETURN,1.0);
3/3

Podobne dokumenty