상세 컨텐츠

본문 제목

DirectX, OpenGL 텍스처 필터링 ( Texture Filtering ) 관련

프로그래밍 관련/3D,2D DRAW 관련

by AlrepondTech 2020. 9. 10. 04:23

본문

반응형

 

=================================

=================================

=================================

 

 

출처: https://m.blog.naver.com/PostView.nhn?blogId=jsjhahi&logNo=201921597&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

 

텍스처 필터링 ( Texture Filtering )

 

Direct3D에서 Primitive를 출력할 때 2차원 화면에 3D Primitive를 매핑한다.화면 이미지 Primitive의 모든 픽셀의 경우, 텍스처로부터 색상값을 얻어와야한다. 이 프로세스를 텍스처 필터링이라고 한다.

 

텍스처 필터 연산을 할 때 확대나 축소할 경우, 이미지가 흐리거나 Aliasing( 윤곽선이 매끄럽지 못하고 계단 모양으로 울퉁 불퉁하게 되는 현상 )

발생하게 된다. 이 문제를 해결하려면, 텍셀값의 혼합한 것을 픽셀색상에 부여한다.( 먹인다. )

 

Nearest-Point Sampling( 근접점 샘플링 )과 Linear Sampling( 선형 필터링 ), Anisortopic Filitering( 비등방성 필터링 ) 텍스처 필터링 종류가 있다.

 

 

IDirect3DDevice9::SetSamplerState 메서드로 통해 샘플러 상태값을 설정한다.

 

HRESULT SetSamplerState( [in]  DWORD Sampler, //< sampler state index [in]  D3DSAMPLERSTATETYPE Type, //< sampler state type 열거형 [in]  DWORD Value //< 설정 상태값 ( 플래그값 ) 즉, 필터링 방식 );

 

D3DSAMP_MAGFILTER     - 확대 필터

D3DSAMP_MINFILTER      - 축소 필터

D3DSAMP_MIPFILTER       - 밉맵 레벨간의 사용하는 텍스처 필터

 

Nearest-Point Sampling( 근접점 샘플링 )

 

- 디폴트 필터링방식이며, 품질이 가장 떨어진다. 가장 계산이 빠르다.

- 텍스처와 Primitive 이미지의 크기가 비슷할 때 가장 빠르고 효과적이다.

- 텍스처와 Primitive 이미지의 크기가 다르면 텍스처가 확대/축소되어야하므로, 뭉침, Alliasing, 흐림 등 발생

 

 

 

 

Linear Sampling( 선형 필터링 )

 

- 비교적 높은 품질의 만들며, 현재의 하드웨어 성능을 고려하면 실행속도 또한 빠르다.

- 보통은 선형 필터링을 사용한다, 텍셀의 평균값을 계산한다.

 

 

 

 

Anisortopic Filitering( 비등방성 필터링 )

 

- 가장 높은 품질의 만들며, 실행속도도 가장 느리다.

- 품질을 결정하는 D3DSAMP_MAXANSOTROPY 레벨을 지정해야한다.

- 레벨값이 높을 수록 높은 품질의 결과물을 얻는다.

 

 

 

 

=================================

=================================

=================================

 

 

출처: http://www.galexandria.com/main/nehe-opengl-tutorials/07-texture-filter-lighting-keyboard-controls

 

제6강에서 저희는 선형필터 텍스쳐 맵을 사용했었습니다. 선형필터는 상당한 양의 CPU 시간을 필요로 하긴 하지만 정말 멋지게 보입니다. 여기서 만들어 낼 첫번째 텍스처는 GL_NEAREST를 사용합니다. 간단히 말해 이 텍스처 종류는 필터링을 전혀 가지지 않습니다. 이는 매우 약간의 CPU시간만을 사용하지만 정말 형편없어 보입니다. 텍스처가 각이져 보이는 게임을 플레이해본적이 있으시다면 아마 그 게임은 이런 타입의 텍스처를 사용하고 있을 것입니다. 이 텍스처 타입의 유일한 장점은 느린 컴퓨터에서도 빠르게 실행된다는 것입니다.


MIN과 MAG에 모두 GL_NEAREST를 사용하는 것 보이시죠? GL_NEAREST를 GL_LINEAR와 혼합할 수도 있으며, 그러면 텍스처가 조금은 더 나아 보일 것입니다. 하지만 저희는 속도에 관심이 있으므로 양쪽에 모두 저품질을 사용합니다. MIN_FILTER는 이미지가 실제 텍스처 사이즈보다 더 작게 그려질때 사용되는 필터이며, MAG_FILTER는 이미지가 원래 텍스처 크기보다 더 클 때 사용됩니다.

       // NEAREST 필터링을 사용한 텍스처를 만든다
       glBindTexture(GL_TEXTURE_2D, texture[0]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // ( 새코드 )
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); // ( 새코드 )
       glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);


다음으로 만들 텍스처는 제6강에서 사용했던 것과 동일한 선형 필터링을 적용한 텍스처입니다. 여기서 바뀐 점은 texture[0]이 아닌 texture[1]에 텍스처를 저장한다는 것입니다. 이것이 두번째 텍스처이기 때문입니다. 위처럼 이 텍스처도 texture[0]에 저장해버리면 GL_NEAREST 텍스처(첫번째 텍스처)를 덮어써 버릴 것입니다.
 
       // 선형필터를 사용하는 텍스처를 만든다
       glBindTexture(GL_TEXTURE_2D, texture[1]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
       glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);


이제 텍스처를 만드는 새로운 방법을 살펴봅시다. 바로 밉매핑(Mipmapping)입니다! 화면상에서 이미지를 매우 작게 만들어보면 세세한 디테일들이 사라지는 현상을 보신적이 있으실 것입니다. 처음에는 멋지게 보이던 패턴들이 점차 이상하게 보이기 시작하지요. OpenGL에게 밉맵을 이용한 텍스처를 구축하라고 말해주면, OpenGL은 다른 크기의 고품질 텍스처를 만듭니다. 밉맵을 사용한 텍스처를 화면상에 그리면 OpenGL은 자신이 만들었던 텍스쳐중 가장 그럴듯해 보이는 녀석(최고의 디테일을 가진 텍스처)을 선택하여 화면에 그릴 것입니다. 즉, 원래 이미지의 크기를 변경하는 일을 하지 않습니다(이러면 디테일을 잃어버리기 때문이지요).

제6강에서 64, 128, 256 등 OpenGL 텍스처의 폭 및 높이제한을 피할 수 있는 방법이 있다고 말씀드린 바 있습니다. gluBuild2DMipmaps가 바로 그 해결방법입니다. 제가 알아낸 바로는 밉맵 텍스처를 구축할 때는 어떤 높이와 너비의 비트맵 이미지라도 사용할 수 있습니다. OpenGL이 그 이미지를 알맞은 너비 및 높이로 자동적으로 변경해줄 것입니다.

이 텍스처는 세번째이므로 texture[2]에 저장합니다. 이제 texture[0]에는 필터링을 사용하지 않는 텍스처가, texture[1]에는 선형 필터링을 사용하는 텍스처가, texture[2]에는 밉맵을 이용하는 텍스처가 저장되어 있습니다. 이쯤되면 본 튜토리얼에 필요한 텍스처를 모두 다 구축한 것이 되는군요.

       // 밉맵 텍스처를 만든다
       glBindTexture(GL_TEXTURE_2D, texture[2]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); // ( 새코드 )

 
다음 라인은 밉맵 텍스처를 만듭니다. 저희는 3가지 색(빨강, 녹색, 파랑)을 이용해서 2D 텍스처를 만들 것입니다. TextureImage[0]->sizeX는 비트맵의 너비이고 TextureImage[0]->sizeY는 비트맵의 높이입니다. GL_RGB는 저희가 빨강, 녹색, 파랑의 순서로 색을 사용한다는 의미이고, GL_UNSIGNED_BYTE는  텍스쳐가 바이트로 구성되어 만들어졌다는 의미입니다. 마지막으로 TextureImage[0]->Data는 저희가 텍스쳐를 만드는데 사용했던 비트맵 데이터를 가르킵니다.

 
       gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); // ( 새코드 )
   }

 

 

 

=================================

=================================

=================================

 

 

 

출처: http://blog.daum.net/aero2k/84

 

 

----------------------------------------------------------

 

코드의 구성은 OpenGL ES 1.x와 유사합니다.

 

(1) glGenTexture() 함수를 이용해서 Texture ID를 생성하고,

(2) glBindTexture() 함수를 이용해서 생성한 Texture ID를 방인딩하고,

(3) glTexImage2D() 함수를 이용해서 "16장 " 에서 얻은 RGBA byte array을 저장하고,

(4) glTexParameteri() 함수를 이용해서 축소필터 GL_TEXTURE_MIN_FILTER 과 확대 필터 GL_TEXTURE_MAG_FILTER 를 설정할 수 있습니다.

(5) glTexParameteri() 함수를 이용해서 GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T 를 이용해서  Vertex 점정의 경계 지점을 부드럽게 보간 시켜주는 GL_CLAMP_TO_EDGE 와 텍스쳐를 계속 반복 시킬 GL_REPEAT를 설정할 수 있습니다.

밉맵을 사용할 경우에는  glGenerateMipmap(GL_TEXTURE_2D) 를 이용해 주고요


 

축소 / 확대 필터 

 

GL_NEAREST : 인접 축소 필터로, 가장 근접한 텍셀이 색상을 사용한다. 단순하고 거칠게 표현된다.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

 

GL_LINEAR : 양방향 선형(bilinear) 필터링 알고리즘으로, 텍셀에서 인접한 2x2 점을 샘플링하여 가중치 평균값을 구한다.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

 

GL_LINEAR_MIPMAP_LINEAR : 삼중 선형(TRILINEAR) 필터링으로 가장 근접한 밉맵 두개를 찾아서 각각 GL_LINEAR 필터링한한 결과 값을 섞는다. OpenGL은 이 필터링을 위해서 8개의 샘플을 추출하므로, 가장 높은 품질의 값을 생성하는 필터이다.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

밉맵은 축소필터에만 영향을 미치며, OpenGL ES 2.0에서 사용할 경우에는 자동 밉맵 함수인

glGenerateMipmap(GL_TEXTURE_2D); 이용해서 처리 가능하다.

 

 

=================================

=================================

=================================

 

 

출처: http://ryumin13.tistory.com/entry/DirectX-%ED%85%8D%EC%8A%A4%EC%B3%90-%ED%95%84%ED%84%B0%EB%A7%81%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 


 다이렉트X 든 opengl 이든.. 보통 3d 물체에 어떤 표면에는.. 텍스쳐를 입힌다. 물론 텍스쳐 없이 기본 빛 속성만 가지고도 색을 표현할 수도 있지만, 그 것은 간단한 물체일 때 가능한 이야기이고, 보통은 텍스쳐 맵핑을 한다. 
 하지만 여기서 생각해 볼 수 있는 것이.. 텍스쳐는 멀리있으나, 가까이 있으나, 해상도가 같다... 미리 만들어 놓은 256x256이든, 512x512 이던 같다는 의미이다. 그렇다면.. 카메라의 위치에 따라 정말 가까이 있는 물체와 저 멀리 있는 물체의 실제 화면에 나타나는 면의 크기는 달라진다. ( 프로젝션 연산의 원근 비율로 인하여) 그렇다면, 같은 픽셀양의 해상도를 가진 텍스쳐가.. 넓게, 혹은 좁게 면안에 색을 채워야 하는데.. 그럴때 설정해 주는 것이 필터링이다. 

 필터링에는 크게 4가지 종류가 있다. (물론 실제로는 6가지이지만, 보통 4가지만 쓴다. )

 

 


이렇게 4가지를 enum으로 정의해서, 현재 예제에서 값이 바뀔때 마다 넣어준다. 실제 D3D의 define 값은.. 6개 이다.


피라미드 형태와 가우시안 필터가 있지만, 보통은 잘 쓰지 않는다. 
그럼 필터를 설정하는 부분을 보자..


loadTexture의 내부를 보면, 파일을 로드한 이후에 샘플러스테이트를 설정해준다. 거기서 3가지를 설정하는데, 현재는 모두 NONE 즉 아무 필터링 옵션 없이 라는 뜻이다. 저기서 MIN, MAG, MIP 필터가 있는데, MIN은 텍스쳐가 실제 해상도보다 축소되었을 때, MAG는 실제 해상도보다 확대 되었을 때, 그리고 MIP필터는, 밉맵인데, 이 필터는 나중에 따로 설명해야 하겠다. 

 

 

그리고 랜더 함수에서 필터가 변했다면, 새로 옵션을을 설정하는 부분을 만들어뒀다. 그리고, 샘플러스테이트에서, 최대Anisotropy 값을 설정해 줄 수 있고, 밉맵의 수치도 설정해 줄 수 있다. 

 

 


위의 사진은 각 부분 함수들의 모습이다.. 

그럼 실제로 화면을 보면서 어떻게 변하는지 보도록 하자...


이 것이 기본 실행 화면에, 아무 설정도 없는 상태이다.

 

 

 

 


위의 3장을 보면, MIN필터의 값을 계속 바꾸지만, 변화가 없다. 왜냐하면, 아직 해상도보다 줄어 들지 않았기 때문에, 바뀔 값이 없기 때문이다. 


이제 mag 필터에서 point와 Linear로 설정해 보았다.

 


하지만 아직 까진 크게 바뀐거 같지 않다... 그래서...

 

 

 

반응형

 

728x90

 

 


확대를 해서 보았다...먼저 아무것도 없는 상태...

 


그리고 포인터..


그리고 Linear다. Anistropic 은 아직 수치 조절을 많이 하지 않으면, 거의 Linear와 흡사한 느낌이다. 먼가 Point와의 차이는.. 약간 뭉게진 듯한. .그런 느낌이 든다.. 그렇다.. 텍스쳐를 화면에 입히다 보면, 케릭터같이 디테일을 요하는 텍스쳐가 있는 반면에, 지면 같이 약간 뭉개진 흙바닥이 더 사실감있어보이는 경우가 있다.. 그럴 때 이런 필터 옵션을 주면 되는 것이다.. 

 

 

 


위의 3장은 Min필터의 None, Point, Linear 옵션이다. 사진상으로는 티가 잘 안나는데, 실제로 화면으로 보면, 역시나, Point는 각 픽셀이 선명하게, Linear는 뭉게져서 나온다.. 

머, 옵션이 별로 필요없어 보일 지도 모른다. 하지만 아까 들었던 예들처럼, 상황에 따라 어떤 필터링 옵션을 주고 안주고에 따라, 화면의 디테일이 더 살아난다는 점을 생각해야하겠다.

출처: http://ryumin13.tistory.com/entry/DirectX-텍스쳐-필터링에-대해서-알아보자 [진정한 프로그래머가 되길 꿈꾸며..]

 

 

=================================

=================================

=================================

 

 

출처: http://blog.naver.com/PostView.nhn?blogId=itrainl4&logNo=90186192562&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

 

[OpenGL ES 2.0] Mip-map Texture 

 OpenGL ES 2.0 

 

[출처] [OpenGL ES 2.0] Mip-map Texture|작성자 비가번

 

 

Texture 필터링에 관한 얘기이다.

 

보통 아래와 같이 쓴다.

 

glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,     GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,     GL_MIRRORED_REPEAT);
 
 glTexImage2D(
  GL_TEXTURE_2D, 0,           /* target, level */
  GL_RGBA,                    /* internal format */
  width, height, 0,           /* width, height, border */
  GL_RGBA, GL_UNSIGNED_BYTE,   /* external format, type */
  pixels                      /* pixels */
  );

 

 

GL_TEXTURE_MIN_FILTER : 텍스쳐 사이즈보다 작은 맵핑 공간에서의 보간 방법 설정

GL_TEXTURE_MAG_FILTER : 텍스쳐 사이즈보다 큰 맵핑 공간에서의 보간 방법 설정

 

보간 방법에는 다음과 같은 것이 있다.

GL_NEAREST : 가까운 픽셀 가져와서 써라

GL_LINEAR : 픽셀 중간을 보간해라.

당연히? Nearest가 빠르고 Linear가 퀄리티가 좋다.

 

여기서 Texturing의 퀄리티를 더 올려주기 위해 Mip-Map 이라는 개념이 나온다.

밉맵은 텍스쳐 원본보다 작은 텍스쳐를 생성하여 (level별로.. 그냥 많이 만듬 반, 반,반 크기로)

텍스쳐 사이즈보다 작은 맵핑공간에서는 작은 Texture를 가져와서 맵핑 시키는거다.

 

왜? 조난 큰 텍스쳐를 작은데 맵핑 시킬려니 보간으로도 해결하기 힘든 부분이 있어서 알리아싱이 많이 생기기 때문이다.

 

  

 

 

 

왼쪽이 밉맵 적용 X, 오른쪽이 밉맵 적용 O

확실한 차이를 보고싶으면 Cube Mesh에 Texture 입힌 후에 빙글 빙글 돌려보면 확실히 차이가 난다.

 

여기서 MIP-MAP이 들어가면 다음과 같은 보간 옵션을 적용 할 수 있다.

 

GL_NEAREST_MIPMAP_NEAREST  : 밉맵사이 Nearest, 밉맵 선택후 텍스쳐 내부에서 Nearest

GL_LINEAR_MIPMAP_NEAREST     : 밉맵사이 Nearest, 밉맵 선택후 텍스쳐 내부에서 Linear    (Bilinear)

GL_NEAREST_MIPMAP_LINEAR     : 밉맵사이 Linear, 밉맵 선택후 텍스쳐 내부에서 Nearest
GL_LINEAR_MIPMAP_LINEAR        : 밉맵사이 Linear, 밉맵 선택후 텍스쳐 내부에서 Linear  (Trilinear)

 

여기서 밉맵 사이 라는것은 밉맵이라는것을 만들때 모든 해상도의 텍스쳐(원본보다 작은)를 생성하지는 않는다.

원본 텍스쳐 해상도의 반을 생성, 그것의 반을 또 생성, 그것의 반또 생성해서 1x1까지인가? 생성할것이다.

그러니 자연스럽게 밉맵 텍스쳐 사이에서도 빈 해상도가 생기게 되는데 그 중간을 가까운곳(Nearest)의 밉맵을 그냥 가져올거냐, 아니면 밉맵사이도 Linear로 보간해서 칠할거냐에 대한 옵션이라 생각 하면된다.

 

여기서 Bilinear와 Trilinear는 저 옵션에 대한 대표 이름으로 인터넷에서 찾아보면 내가 설명한거랑 비슷할거다.

 

밑에 그림을 자세히보면 차이가 있을것이다.

 

여기서 anisotropic 이라는것이 또 나오는데 OpenGL ES2.0 에서 지원 하지 않는 것 같다.

그러니 솔직히 이건 잘모른다. ㅋㅋㅋㅋ Trilinear같은경우 자연스럽게 연결은 되지만 작아질수록 뿌옇게 흐려지는 상태가 되는데 Anisotropic의 경우 이런 알리아싱을 막아준다.

 

혹시 더 잘아시는 분 있으면 설명 쫌...ㅠ

 

아! 밉맵 적용방법은 아래 코드와 같다.

glBindTexture(GL_TEXTURE_2D, texture);
 
 if(bMipmap == true)
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,  GL_LINEAR_MIPMAP_LINEAR);
 else
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,     GL_MIRRORED_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,     GL_MIRRORED_REPEAT);
 
 glTexImage2D(
  GL_TEXTURE_2D, 0,           /* target, level */
  GL_RGBA,                    /* internal format */
  width, height, 0,           /* width, height, border */
  GL_RGBA, GL_UNSIGNED_BYTE,   /* external format, type */
  pixels                      /* pixels */
  );
 
 if(bMipmap == true)
  glGenerateMipmap(GL_TEXTURE_2D);

 

중요한건 밉맵 적용시 MIN-FILTER만 적용된다. MAG-FILTER에 밉맵 보간 옵션 넣으면 당연히 안된다.

왜냐!? 밉맵 자체가 작은 것만 생성하고 카바 쳐주는거다.  당연한것!

 

그리고 GL_TEXTURE_2D 뿐만 아니라 GL_TEXTURE_CUBE_MAP또한 지원한다.

위에 소스에서 조금만 고치면 됨.

 

그럼 즐밤 되세용~

[출처] [OpenGL ES 2.0] Mip-map Texture|작성자 비가번

 

 

=================================

=================================

=================================

 

 

 

출처: https://docs.microsoft.com/ko-kr/windows/uwp/graphics-concepts/texture-filtering-with-mipmaps

 

Mipmap을 사용하는 텍스처 필터링

 

Mipmap이란 순차적으로 이어지는 텍스처로서 각각 동일한 이미지의 해상도가 점차 낮아지면서 표현됩니다. Mipmap에서 각 이미지 또는 수준의 높이와 너비는 이전 수준보다 2의 제곱 더 작습니다. Mipmap이 사각형일 필요는 없습니다.

고해상도의 Mipmap 이미지는 사용자와 가까운 객체에 사용됩니다. 저해상도의 이미지는 멀리 보이는 객체에 사용됩니다. Mipmap을 사용하면 메모리 사용량이 늘어나지만 렌더링되는 텍스처의 품질이 향상됩니다.

Direct3D는 연쇄적으로 연결된 표면 사슬로 Mipmap을 표현합니다. 가장 높은 해상도의 텍스처가 사슬의 전면에 위치하고 연쇄적으로 다음 수준의 Mipmap이 연결됩니다. 이후에도 다음 수준의 텍스처가 연쇄적으로 연결되어 가장 낮은 해상도의 Mipmap까지 이어집니다.

다음 그림은 이러한 수준의 예를 나타냅니다. 비트맵 텍스처가 3D 1인칭 게임에서 컨테이너의 기호를 표현합니다. 이것을 Minimap으로 생성하면 가장 높은 해상도의 텍스처가 제일 먼저 나타납니다. 이후 Mipmap 집합에서 텍스처가 이어질 때마다 높이와 너비가 2의 제곱씩 작아집니다. 이 경우 최대 해상도의 Mipmap은 256x256 픽셀입니다. 다음은 128x128입니다. 연쇄 사슬에서 마지막 텍스처는 64x64입니다.

이 기호는 최대 가시 거리일 때의 모습입니다. 사용자가 기호에서 멀어지기 시작하면 게임은 Mipmap 사슬에서 가장 작은 텍스처를 표시하며, 여기에서는 64x64 텍스처입니다.

 

이제 사용자가 기호에 가깝게 시점을 이동하면 Mipmap에서 더욱 높은 해상도의 텍스처가 점진적으로 사용됩니다. 다음 그림의 해상도는 128x128입니다.

 

사용자의 시점이 기호까지 초소 허용 거리에 도달하면 다음 그림과 같이 가장 높은 해상도의 텍스처가 사용됩니다.

 

이는 텍스처의 원근감을 더욱 효율적으로 시뮬레이션할 수 있는 방법입니다. 단일 텍스처를 여러 해상도로 렌더링하기 보다는 각기 다른 해상도에서 다수의 텍스처를 사용하는 것이 더욱 빠릅니다.

Direct3D는 Mipmap 집합에서 원하는 출력에 가장 가까운 해상도인 텍스처를 평가한 후 픽셀을 해당하는 텍셀 공간으로 매핑합니다. 최종 이미지의 해상도가 Mipmap 집합의 두 텍스처 해상도 사이라면 Direct3D가 두 Mipmap의 텍셀을 검사하여 색상 값을 혼합합니다.

Mipmap을 사용하려면 응용 프로그램이 Mipmap 세트를 생성해야 합니다. 응용 프로그램은 현재 텍스처 집합에서 Mipmap 집합을 첫 번째 텍스처로 선택하여 Mipmap을 적용합니다. 텍스처 혼합을 참조하세요.

그런 다음 응용 프로그램이 Direct3D가 텍셀 샘플링에 사용할 필터링 방법을 설정해야 합니다. 가장 빠른 Mipmap 필터링 방법은 Direct3D가 가장 가까운 텍셀을 선택하도록 하는 것입니다. D3DTEXF_POINT 열거형 값을 사용하여 이 방법을 선택하세요. 응용 프로그램이 D3DTEXF_LINEAR 열거형 값을 사용하는 경우에는 Direct3D의 필터링 결과가 더 나아질 수 있습니다. 가장 가까운 Mipmap을 선택한 후 텍스처에서 현재 픽셀이 매핑되는 위치를 중심으로 텍셀의 가중 평균을 계산하기 때문입니다.

Mipmap 텍스처는 렌더링 시간을 줄일 목적으로 3D 장면에 사용됩니다. 또한 장면의 현실감을 높이기도 합니다. 단, 종종 많은 양의 메모리가 필요합니다.

참고 Mipmap 사슬에서 각 표면의 크기는 선행 표면의 크기보다 50% 작습니다. 예를 들어 최상위 Mipmap의 크기가 256x128이라면, 두 번째 Mipmap의 크기가 128x64이고, 세 번째가 64x32인 식으로 이어져 1x1까지 계속 됩니다. 수준에서 다수의 Mipmap 수준을 요청할 수는 없습니다. 사슬의 Mipmap 너비 또는 높이가 1보다 작아질 수도 있기 때문입니다. 쉽게 말해서 최상위 Mipmap 표면의 크기가 4x2라면 수준에서 허용되는 최대 값은 3입니다. 최상위 크기가 4x2이면, 두 번째는 2x1이고, 세 번째는 1x1이 됩니다. 수준에서 값을 3보다 크게 설정하면 두 번째 Mipmap의 높이가 분수 값이 되어 사용할 수 없습니다.

Direct3D는 Mipmap 텍스처 필터링을 자동 실행할 수 있습니다. 응용 프로그램은 Mipmap 사슬을 수동으로 횡단하여 사슬의 각 표면에 비트맵 데이터를 로드할 수 있습니다. 종종 사슬을 횡단하는 이유는 단 하나입니다. 텍스처 생성 시 Mipmap을 자동으로 생성하게 하면 Mipmap이 비디오 메모리에 상주하여 하드웨어 필터링을 이용하기 때문입니다.

 

 

=================================

=================================

=================================

 

 

 

반응형


관련글 더보기

댓글 영역