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