OpenGL Frame Buffer Buffer, Image, and Texture Mapping 321190 2007년봄학기 5/22/2007 박경신 색버퍼 (Color buffers) 전면버퍼 (Front buffer) 후면버퍼 (Back buffer) 보조버퍼 (Auxiliary buffer) 오버레이면 (Overlay plane) 깊이버퍼 (Depth buffer) 누적버퍼 (Accumulation buffer) High resolution buffer 스텐실버퍼 (Stencil buffer) Holds masks Images 이미지데이터는파일에서부터읽어들이거나직접생성 일반적인이미지파일포멧 : JPEG, TIFF, PNG, GIF, RGB, EPS, BMP, etc 이미지포멧 : Color channel: greyscale, RGB, RGBA Bit resolution Compression: 손실부호화 (lossy), 무손실부호화 (lossless) COIN3D simage http://www.coin3d.org/lib/simage COIN3D simage library 가제공하는이미지파일포멧 JPEG, TIFF, PNG, PIC, TGA, EPS, GIF, RGB, etc COIN3D의 simage library를사용하려면, 프로젝트에 additional library and include directory를추가해야한다. Project -> Properties(ALT+F7) -> Configuration Properties -> C/C++ -> General에 Additional Include Directories에.\simage를넣는다. Project -> Properties(ALT+F7) -> Configuration Properties -> C/C++ -> Preprocessor에 Preprocessor Definitions 에 ;SIMAGE_DLL를넣는다. Project -> Properties(ALT+F7) -> Configuration Properties -> Linker -> General에 Additional Library Directories에.\simage를넣는다. Project -> Properties(ALT+F7) -> Configuration Properties - > Linker -> Input에 Additional Dependencies에 simage1.lib을넣는다.
COIN3D simage Example unsigned char *imgptr; unsigned char *imagedata; unsigned char *rescaledimagedata; int imagewidth = 0, imageheight = 0, numcomponents = 0; imagedata = simage_read_image (filename, &imagewidth, &imageheight, &numcomponents); // read GLsizei xdim2,ydim2; // 만약이미지크기가 2의승수가아니면, resize GLenum type; xdim2 = 1; while (xdim2 <= imagewidth) xdim2 *= 2; xdim2 /= 2; ydim2 = 1; while (ydim2 <= imageheight) ydim2 *= 2; ydim2 /= 2; if ((imagewidth!= xdim2) (imageheight!= ydim2)) { rescaledimagedata = simage_resize(imagedata, imagewidth, imageheight, numcomponents, xdim2, ydim2); imgptr = rescaledimagedata; } else imgptr = imagedata; OpenGL Images gldrawpixels 를사용하여이미지를그릴수있음 gldrawpixels(glsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* image) width, height: 이미지크기 (in pixel) format: GL_RGB: RGB 이미지 GL_RGBA: RGBA 이미지 ( 알파채널포함 ) GL_BGR_EXT: BGR 이미지 GL_LUMINANCE: 흑백이미지 주로 GL_RGB 나 GL_BGR_EXT 를사용함. GL_BGR_EXT 는 windows 의 24-bit 비트맵에서만지원하는데 GL_RGB 보다훨씬빠르게실행됨. type: 픽셀데이터의자료형. 보통 GL_UNSIGNED_BYTE 를사용함 image: 이미지데이터배열 OpenGL Images glreadpixels 를사용하여화면에서 image 를읽는게가능 glreadpixels(glint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* image); 현재의 raster 위치를무시하고읽기위하여이미지의왼쪽아래 (bottom-left) 에대한뷰포트 (view port) 좌표지정이필요 프레임버퍼 ( 컬러버퍼, 깊이버퍼, 스텐실버퍼 ) 에서왼쪽아래를 (x, y) 좌표로시작하여너비 (width), 높이 (height) 를갖는사각영역으로부터픽셀데이터를읽어서메모리로가져옴 image 에는설정한 width * height * 3 (RGB) 배열에저장함 format 은픽셀데이터요소의유형을설정함 type 은각요소의데이터유형을설정함. gldrawpixels 의 type 인자와동일 OpenGL Images glcopypixels를사용하여화면의 image를읽어서프레임버퍼영역의현재래스터위치로복사 glcopypixels(glint x, GLint y, GLsizei width, GLsizei height, GLenum type); 프레임버퍼 ( 컬러버퍼, 깊이버퍼, 스텐실버퍼 ) 에서왼쪽아래를 (x, y) 좌표로시작하여너비 (width), 높이 (height) 를갖는사각영역을버퍼에복사함 복사되는위치는 glrasterpos() 함수를사용했을때그다음에그려질위치를설정한인자값에의해결정될수도있고다시재설정할수있음 복사할때사용할프레임버퍼를지정하기위해 type이사용됨. GL_COLOR, GL_STENCIL, 또는 GL_DEPTH으로지정할수있음
Texture Mapping The Limits of Geometric Modeling Wireframe Flat shading 기하학적모델링 고성능그래픽스카드가초당 1000 만개의폴리곤을렌더링할수있다하더라도구름, 초원, 지형, 스킨 (skin) 등과같은객체 / 현상을기하학적텍스쳐들로모델링하여처리하기엔무리가있음. 텍스쳐맵핑 제한된수의다각형을사용해야하는실시간렌더링에있어서비교적적은추가비용으로이미지의사실성을상당히높일수있는기법임. Smooth shading Texture mapping Three Types of Mapping Texture Mapping 텍스쳐맵핑 (Texture Mapping) 이미지를사용하여다각형 (polygon) 의내부에그려짐. 환경맵핑 (Environment/Reflection mapping) 환경이미지가렌더링될표면위에그려짐. 반사맵 (reflection map) 또는환경맵 (environmental map) 은반사광을추적하지않고도광선추적법에의한매우반짝이는표면 (highly specular surface) 을만들수있음. 범프맵핑 (Bump mapping) 렌더링음영작업시법선벡터 (normals) 를왜곡시켜실제오렌지표면의융기와같은모양을생성. geometric model texture mapped
Environment Mapping Bump Mapping Texture Mapping 개념적인 2 차원텍스쳐맵핑과정 표면매개화 (surface parameterization) 과정 텍스쳐이미지를물체에어떻게입힐것인가? 물체의각점에맵핑되는텍스쳐이미지의좌표가필요함 (x0, y0, z0) => (xt, yt) 기하변환과정 기하변환은물체의각점과투영화면에서의위치간의맵핑관계를결정. 래스터과정 각기하물체가투영되는화소들을찾아주는과정 텍스쳐색계산과정 각화소에적절히텍스쳐색으로칠해주는과정 각화소를통하여보이는텍스쳐이미지의색을어떻게계산할것인가? 계산된텍스쳐색을물체의원래의색깔과어떻게혼합할것인가? Texture Mapping 텍스쳐맵핑은 2차원의이미지를 3차원의표면에맵핑 모두 3~4 개의좌표계간맵핑처리를포함한일련의과정이필요함 2D image 3D surface
Coordinate Systems Parametric coordinates 곡선과곡면 (curves & surfaces) 모델링에사용하는매개변수형좌표계 Texture coordinates 텍스쳐내의위치지정을위해사용하는텍스쳐좌표계 Object or World Coordinates 텍스쳐기입쳐질물체를기술하는객체좌표계또는세상좌표계 Window Coordinates 최종적인이미지가형성되는윈도우좌표계 Texture Mapping Parametric coordinates Texture coordinates World coordinates Window coordinates Mapping Functions 텍스쳐는생성하여프로세서메모리에배열로저장됨 텍스쳐는응용프로그램에의해생성되거나사진으로부터스캔하여생성할수있음 이배열의요소들을텍셀 (texture element = texel) 이라부름 텍스쳐좌표에서표면의한점으로맵핑하는함수 텍스쳐좌표 : T (s, t) 객체좌표 : P (x, y, z) (x,y,z) Backward Mapping 물체위의점 (x, y, z) 이주어졌을때, 대응하는텍스쳐좌표를어떻게찾을것인가? 텍셀 T(s, t) 를찾는역함수 s = s(x,y,z) t = t(x,y,z) x = x(s,t) y = y(s,t) z = z(s,t) t s
Two-part mapping 맵핑문제의해법 : Two-part mapping 텍스쳐를먼저구 (sphere), 원기둥 (cylinder), 입방체와같은간단한 3 차원매개변수형표면에텍스쳐를맵핑 예제 : 원기둥 (cylinder) 으로맵핑 Cylindrical Mapping 매개변수형원기둥함수 (parametric cylinder) x = r cos 2π u y = r sin 2π u z = v/h u, v 공간의사각형을세상좌표계의반지름 r과높이h를가진원기둥에맵핑 s = u t = v 그리고, 텍스쳐공간으로부터맵핑 Spherical Map 매개변수형구함수 (parametric sphere) x = r cos 2πu y = r sin 2πu cos 2πv z = r sin 2πu sin 2πv 원기둥함수과비슷함. 그러나구와같이닫힌객체에맵핑할경우형상의일그러짐이필요함. 메르카토르 (Mercator) 투영의경우, 양극 (pole) 에가장큰일그러짐을만듬 Spherical mapping은환경맵 (environmental maps) 에서사용됨 Box Mapping 간단한직교투영 (simple orthographic projection) 과사용하기편리함 Box mapping은환경맵 (environmental maps) 에서사용됨
Second Mapping 두번째맵핑 (second mapping) 은중간객체 (intermediate object) 상의텍스쳐값을원하는표면 (actual object) 에맵핑 중간매개표면으로부터의법선사용 객체표면으로부터의법선사용 객체중심으로부터의벡터사용 Aliasing 텍스쳐의포인트샘플링 (point sampling) 방법은앨리어싱문제 (aliasing error) 를만들수있음 포인트샘플링 점에서점으로의맵핑 miss blue stripes point samples in u,v (or x,y,z) space actual object intermediate object point samples in texture space Area Averaging 보다효과적이나다소느린영역평균법 (area averaging) 방법을사용가능함 영역평균법 - 영역에서영역으로의맵핑 preimage pixel Basic Strategy 텍스쳐를입히기위한 3가지단계 1. 텍스쳐를지정 이미지를파일에서읽거나직접생성 텍스쳐에할당 텍스쳐링활성화 2. 각정점에텍스쳐좌표를할당 프로그래머가직접적절한맵핑함수작성 3. 텍스쳐인수를지정 랩핑 (wrapping) 필터링 (filtering) Note: 화소의전이미지 (preimage) 는곡면임
Texture Mapping y Texture Example 다음예제는 256 x 256 이미지를사각형 (rectangular polygon) 에텍스쳐맵핑하여원근투영한모습을보여주고있음. z x geometry display Texture coordinates: T(s, t) t image s = f(x, y, z) t = g(x, y, z) Value: s LUMINANCE, RGB, RGBA Texture Mapping in the OpenGL Pipeline 이미지와기하학적객체는각기다른파이프라인에서연산된후래스터과정에서합성됨 즉, 복잡한텍스쳐가있다하더라도기하학적객체의복잡성 (complexity) 에전혀영향을주지않음 정점 geometry pipeline Specifying a Texture Image 512x512크기의이미지 imagedata 텍스쳐이미지를프로그램에서생성하거나파일로부터읽혀서 CPU 메모리에배열로정의함 GLubyte imagedata[512][512]; 텍스쳐맵핑을활성화 glenable(gl_texture_2d) OpenGL은 1,2,3,4-차원텍스쳐맵을지원함 rasterizer 이미지 pixel pipeline
Define Image as a Texture glteximage2d( target, level, components, w, h, border, format, type, texels ); target: 텍스쳐타입, e.g., GL_TEXTURE_2D level: mipmapping 에서사용 components: texel 별요소, e.g., RGB width, height: texel 의너비와높이 (in pixels) border: smoothing 에사용 format, type: texel 을정의하는포멧과타입 texels: texel 배열에대한포인터 glteximage2d(gl_texture_2d, 0, RGB, imagewidth, imageheight, 0, GL_RGB, GL_UNSIGNED_BYTE, imagedata); Converting A Texture Image OpenGL은텍스쳐이미지크기가 2의승수 (power of 2) 로지정되어야함 64x64, 64x128, 512x512, 만약이미지의크기가 2의승수가아니면, 프로그램상에서 gluscaleimage를사용하여크기조절을해야함 gluscaleimage( format, w_in, h_in, type_in, *data_in, w_out, h_out, type_out, *data_out ); data_in 원본이미지 data_out 이미지크기가조절된최종이미지 크기조절시이미지는자동적으로보간과필터링이됨 Mapping a Texture 매개변수형텍스쳐좌표에바탕을두고있음 각정점별로 gltexcoord*() 를사용하여텍스쳐좌표를지정해야함 t 0, 1 Texture Space a b 1, 1 0, 0 1, 0 c s (0.4, 0.2) B Object Space (s, t) = (0.2, 0.8) A C (0.8, 0.4) Mapping a Texture 각정점별로텍스쳐좌표지정 glbegin(gl_polygon); glcolor3f(r0, g0, b0); //if no shading used glnormal3f(u0, v0, w0); // if shading used gltexcoord2f(s0, t0); glvertex3f(x0, y0, z0); glcolor3f(r1, g1, b1); glnormal3f(u1, v1, w1); gltexcoord2f(s1, t1); glvertex3f(x1, y1, z1);.. glend(); Note: 코드의효율을향상시키기위하여정점배열을사용
Interpolation OpenGL 은다각형내부점에대한텍스쳐좌표를계산하기위해보간 (interpolation) 을이용함 good selection of tex coordinates poor selection of tex coordinates texture stretched over trapezoid showing effects of bilinear interpolation Texture Parameters OpenGL 에서텍스쳐가어떻게적용될지결정해주는다양한인자 (parameters) 를제공하고있음 랩핑 (Wrapping) s, t 가 (0, 1) 의범위를넘었을때어떻게 s, t 값을어떻게정할것인지결정해주는인자. CLAMP, REPEAT 필터 (Filter modes) 포인트샘플링대신영역평균법을사용하도록함. 밉맵 (Mipmapping) 텍스쳐를여러개의해상도를사용할수있도록함. 환경인자 (Environment parameters) 텍스쳐맵핑이음영 (shading) 과어떻게상호작용할지결정해줌 Wrapping Mode Clamping: (0, 1) 범위내로값을강제조정 만약 s, t 가 1 보다크면, 1 을사용 만약 s, t 가 0 보다작으면, 0 을사용 Wrapping: (0, 1) 범위를넘어서값에대해텍스쳐반복 s,t %1 을사용 gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_CLAMP) gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_REPEAT) Magnification and Minification 확대 (Magnification) texel 이한 pixel 보다클때 축소 (Minification) texel 이한 pixel 보다작을때 포인트샘플링 (Point sampling) 선형필터링 (linear filtering) 포인트샘플리에의해결정된텍셀의이웃을포함한텍셀그룹의가중평균을사용 최근점 (nearest) 선형보간에의해계산된값에가장가까운텍셀값사용 t texture s GL_REPEAT wrapping GL_CLAMP wrapping Texture Polygon Magnification Texture Polygon Minification
Filter Modes 텍스쳐필터지정 gltexparameteri( target, type, mode ) gltexparameteri(gl_texture_2d, GL_TEXURE_MAG_FILTER, GL_NEAREST); gltexparameteri(gl_texture_2d, GL_TEXURE_MIN_FILTER, GL_LINEAR); Mipmapped Textures 밉맵핑 (Mipmapping) 은일련의축소된크기의텍스쳐배열 (prefiltered texture map) 을생성하는것을허용 밉맵핑은작은객체에텍스쳐맵핑을할시보간문제를줄여줌 텍스쳐정의할시밉맵계층레벨을지정할수있음 glteximage2d( GL_TEXTURE_*D, level, ) GLU 밉맵함수를통해서자동으로축소된크기의텍스쳐생성 glubuild2dmipmaps(gl_texture_2d, GL_RGB, 64, 64, GL_RGB, GL_UNSIGNED_BYTE, imagedata) OpenGL에서최적의밉맵핑과포인트샘플링을이용하기위해다음옵션사용 gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST) gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR) Aliasing Example Texture Environment point sampling mipmapped point sampling linear filtering mipmapped linear filtering gltexenv{fi}[v](..) 를사용하여텍스쳐와음영간의상호작용을지정함 gltexenvf(gl_texture_env, GL_TEXTURE_ENV_MODE, mode); GL_TEXTURE_ENV_MODE 의모드 : GL_MODULATE: 텍스쳐의색성분과음영에서주어지는색성분을곱함으로써텍스쳐맵핑없이할당될음영을변조가능 GL_DECAL: 텍스쳐의색이객체의색을완전히결정 GL_BLEND: 환경색과합성함 GL_REPLACE: 텍스쳐색만사용함 GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE 합성할색은 GL_TEXTURE_ENV_COLOR으로지정함
Perspective Correction Hint 텍스쳐좌표와색보간 OpenGL에서텍스쳐값을찾기위해서스크린공간에서선형보간을사용 직교투영에서는선형맵핑이올바르지만, 원근투영에서는비선형깊이신축률때문에올바르지않음 ( 보다느림 ) 다각형의경계 (edge) 에서더욱두드러지므로, glhint로보다나은보간을요청할수있음 glhint(gl_perspective_correction_hint, hint) GL_DONT_CARE GL_NICEST GL_FASTEST Generating Texture Coordinates gltexgen{ifd}[v]() 를사용하여텍스쳐좌표를자동적으로생성할수있음 평면 (plane) 을지정해야함 - 평면으로부터의거리에바탕을둔텍스쳐좌표를생성 모드 : GL_OBJECT_LINEAR GL_EYE_LINEAR GL_SPHERE_MAP ( 환경맵에서사용함 ) Texture Objects 텍스쳐는 OpenGL state 임 다른객체마다다른텍스쳐를가진다면, OpenGL 은 CPU 메모리에서텍스쳐메모리로아주큰데이터를움직여야함. 최신 OpenGL 은텍스쳐객체 (texture objects) 를가짐 텍스쳐객체당 1 개이미지 텍스쳐메모리 (Texture memory) 는여러개텍스쳐객체를가질수있음 Other Texture Features 환경맵 (Environment Maps) 물체를둘러싸고있는주위환경이이물체에반사되는결과를원할경우 3차원공간이매우큰가상적구또는입방체에의해둘러싸였다고가정 와이드앵글렌즈로찍은환경이미지로부터 spherical map 생성후자동텍스쳐좌표생성을사용 멀티텍스쳐링 (Multitexturing) 하나이상의텍스쳐를객체에적용해서렌더링효과를높이는경우