Alpha Channel Alpha Blending 321190 2007년봄학기 6/1/2007 박경신 Alpha Channel Model Porter & Duff s Compositing Digital Images, SIGGRAPH 84 RGBA alpha는 4번째색으로불투명도 (opacity of color) 조절에사용함 불투명도 (opacity) 는얼마나많은빛이면을관통하는가의척도임 투명도 (transparency) 는 1 alpha 로주어짐 Alpha=1.0 완전히불투명 Alpha=0.5 - 반투명 Alpha=0.0 완전히투명 Blending 프레임버퍼의색과물체의색을합성함 알파블렌딩 물체의색을투명하게나타나게함 일반적인블렌딩공식 R = A1 * R1 + (1 - A1) * R2 G = A1 * G1 + (1 - A1) * G2 B = A1 * B1 + (1 - A1) * B2 OpenGL Blending glblendfunc() 함수에서쓰이는블렌딩공식 R = A1 * R1 + (1 - A1) * R2 G = A1 * G1 + (1 - A1) * G2 B = A1 * B1 + (1 - A1) * B2 // alpha = 0.25 glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); // alpha = 0.25 R = 0.25*R1 + 0.75*R2 G = 0.25*G1 + 0.75*G2 B = 0.25*B1 + 0.75*B2
OpenGL Blending 블렌딩활성화 glenable(gl_blend) 블렌딩함수정의 glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA) [0, 1] 영역의알파값추가 glcolor4f(1, 0, 0, 0.5); // transparency 50% red 혹은알파가있는 RGBA 텍스쳐이미지를사용함 Smooth-shaded Alpha R,G,B 색들과마찬가지로응용프로그램에서각각의픽셀에대한 Alpha 값을제어할수있음 만약알파값이각정점에다르게지정되어있으면, 알파값도보간되어나타남 그래서부드러운면 (soft edge) 을형성할수있음 Time-Varying Alpha 시간의경과에따라알파값을변하게주어 fade-in 또는 fade-out 효과를줄수있음 Texture Alpha RGBA 4 채널텍스쳐이미지를사용하여보다복잡한형체를간단한기하객체를사용하여구성할수있음
Chroma Keying 영화나비디오프로덕션에서많이사용 크로마키잉의단적인예로, 기상캐스터의 TV 날씨방송에서실시간액터 (live actor) 의이미지와그래픽적인날씨정보의합성을들수있음 배경색을찾아서그값을알파값으로지정하여사용함 Other Blending Functions 일반적인블렌딩함수 R = SourceFactor * R s + DestinationFactor * R d G = SourceFactor * G s + DestinationFactor * G d B = SourceFactor * B s + DestinationFactor * B d Source color (R s, G s, B s ) 는물체의색 Destination color (R d, G d, B d ) 는프레임버퍼에있는색 SourceFactor, DestinationFactor 는 glblendfunc() 함수로지정함 Other Blending Functions Blending & Drawing Order Factor name GL_ZERO GL_ONE GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS_DST_ALPHA GL_CONSTANT_ALPHA GL_ONE_MINUS_CONSTANT_ALPHA GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR GL_DST_COLOR GL_ONE_MINUS_DST_COLOR GL_CONSTANT_COLOR GL_ONE_MINUS_CONSTANT_COLOR Computed Factor 0 1 A s 1 - A s A d 1 - A d A c 1 - A c (R s, G s, B s ) (1 R s, 1 G s, 1 B s ) (R d, G d, B d ) (1 R d, 1 G d, 1 B d ) (R c, G c, B c ) (1 R c, 1 G c, 1 B c ) 블렌딩은현재그리고자하는물체와이전에그려진물체의그림그리는순서 (drawing order) 가중요함 블렌딩함수의 source color( 현재그리고자하는물체의색 ) 와 destination color ( 이미그려진프레임버퍼의색 ) 로작용함 만약투명한물체와불투명한물체를같이그리고자한다면, 불투명부터먼저그린후에투명한것을그릴것 Depth-buffering 이블렌딩전에실행되도록함 구를먼저그린후입방체를그릴것
Blending & Drawing Order 만약여러개의투명한물체를같이그리고자한다면, 전향순서 (back-to-front order) 로그릴것 이순서는카메라의위치에의해서달라질수있음 여러개의투명한물체를같이그릴때, 서로를가리는현상 (occlusion) 을막기위해서 depth mask 를비활성화함 gldepthmask(gl_false) 를통하여깊이버퍼를 read-only 로만듬 Backface Culling 투명한물체를그릴때는후면추리기 (backface culling) 를활성화할것 투명한물체는일반적으로후면이보이게됨 glenable(gl_cull_face) 는물체의후면 (backface) 를그리는것을막아줌 4 CCW 3 1 2 Front face 4 3 CW gldisable(gl_cull_face) glenable(gl_cull_face) 1 2 Back face Filtering 블렌딩은전체장면의색을필터링하는효과에사용될수있음 전체화면의크기를가진사각형을그리고블렌딩함수를적용함 Filtering // 전체장면에보라색으로만듬 glblendfunc(gl_zero, GL_SRC_COLOR); glcolor4f(1.0, 0.0, 0.5, 1.0); // 전체장면을어둡게함 glblendfunc(gl_zero, GL_SRC_ALPHA) glcolor4f(1.0, 1.0, 1.0, 0.5) // 전체장면의색을보색 (inverted color) 으로바꿈 glblendfunc(gl_one_minus_dst_color, GL_ZERO); glcolor4f(1.0, 1.0, 1.0, 1.0)
Multipass Rendering 같은물체를다른모드를사용하여여러번렌더링하는것 예를들어, 라이트맵 (lightmap) 효과를위해물체를정상적으로그리고난후블렌딩함수를사용하여같은물체를다시한번그려줌 // first pass 일반텍스쳐를사용하여정상적으로그림 glbindtexture(gl_texture_2d, textureid1); glbegin(gl_quads); glend(); // second pass 라이트맵텍스쳐와원래텍스쳐를블랜딩함 gldepthfunc(gl_lequal); // accept co-planar fragments glenable(gl_blend); glblendfunc(gl_one, GL_ONE); glbindtexture(gl_texture_2d, textureid2); glbegin(gl_quads); glend(); gldepthfunc(gl_less); gldisable(gl_blend); Fog 연무효과 (fog effect) 깊이에의존적인색으로블렌딩함으로써물체와관측자사이의부분적인반투명공간의느낌을생성함 연무블렌딩함수 finalcolor = FogFactor * fragmentcolor + (1 FogFactor) * fogcolor 연무계수 (fog factor) Exponential Gaussian Linear (depth cueing) OpenGL Fog OpenGL 에서연무효과는연무색과단편 (fragment) 의색이합성되는것임. 합성의정도는렌더링될단편과관측자와의거리함수로계산됨. GLfloat fcolor[4] = {1.0, 1.0, 1.0, 1.0}: glenable(gl_fog); glfogi(gl_fog_mode, GL_LINEAR); glfogf(gl_fog_start, 5.0); glfogf(gl_fog_end, 40.0); glfogfv(gl_fog, fcolor); OpenGL Fog Mode 연무계수 (fog factor) Linear glfogi(gl_fog_mode, GL_LINEAR); GL_FOG_START, GL_FOG_END Exponential Gaussian glfogi(gl_fog_mode, GL_EXP); glfogi(gl_fog_mode, GL_EXP2); GL_FOG_DENSITY GLfloat fcolor[4] = {1.0, 1.0, 1.0, 1.0}: glenable(gl_fog); glfogi(gl_fog_mode, GL_EXP); glfogf(gl_fog_density, 0.5); glfogfv(gl_fog, fcolor);