블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (666)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (105)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (217)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total343,756
Today5
Yesterday73

밉맵 필터링

Study/Directx 9 / 2009.06.26 13:02
밉맵 (mipmap) 은 텍스처 집합으로, 각 텍스처는 동일한 이미지에 대해 점진적으로 낮은 해상도를 가지며, 각 이미지의 높이와 너비 (혹은 레벨) 는 이전 레벨보다 2의 거듭제곱만큼 작다. 하지만 반드시 제곱이어야 하는건 아니다. 고해상도 밉맵 이미지는 유저에게 가까운 개체, 저해상도 밉맵 이미지는 멀리 있는 개체에 사용되며, 이는 보다 많은 메모리를 사용해 렌더링된 텍스처의 질을 높이는 방식이다.

    D3D는 밉맵을 덧붙여진 표면들의 체인으로 표현한다. 즉 가장 높은 해상도의 텍스처가 맨 처음에 위치하며 가장 낮은 해상도의 텍스처가 맨 마지막에 위치한다. 다음 비트맵 텍스처는 3D 1인칭 게임에서 컨테이너 표지를 나타낸다. 이 텍스처가 밉맵으로 만들어지면, 텍스처는 해상도 순으로 위치하며, 각 텍스처의 높이와 너비는 2의 제곱만큼의 차이를 갖는다. 여기에서 밉맵은 각각 64×64, 128×128, 256×256다.

이 표지를 볼 수 있는 최대 거리에 있을 때의 텍스처로, 아래의 해상도는 64×64다:


유저의 시점이 표지에 가까워지면, 점진적으로 고해상도의 텍스처가 사용되며, 아래의 해상도는 128×128이다:

이 표지를 볼 수 있는 최소 거리에 있을 때의 텍스처로, 가장 높은 해상도의 텍스처가 사용된다:

    이 방식은 텍스처의 원근을 시뮬레이션하는 가장 효과적인 방법인데, 1개의 텍스처를 다양한 해상도에서 렌더링하는 것보다, 이처럼 여러 개의 텍스처를 다양한 해상도에서 사용하는게 더 빠르기 때문이다. D3D는 밉맵 집합 중 어떤 텍스처가 원하는 결과에 가장 가까운 해상도인지 평가하고, 그 텍셀 공간에 픽셀들을 매핑할 수 있다. 최종 이미지의 해상도를 가진 텍스처가 밉맵 집합에 있다면, D3D는 두 밉맵 내의 텍셀들을 검사하고 그들의 색상을 섞을 수 있다.

    밉맵을 사용하려면 우선 밉맵 집합을 만들어야 하는데, 이는 현재 텍스처 집합의 첫번째 텍스처를 밉맵 집합으로 선택하면 된다. 세부사항은 Texture Blending을 참조한다. 다음으로 텍셀을 샘플링하는데 사용할 필터링 방법을 선택한다. 가장 빠른 밉맵 필터링 방법은 근접점 샘플링으로, D3DTEXF_POINT를 사용한다. 좀 더 나은 결과를 얻으려면, D3DTEXF_LINEAR를 사용한다.

    밉맵 텍스처는 scene 렌더링 시간을 줄이기 위해 3D scene에서도 사용되는데, 이는 scene의 현실성도 높일 수 있다. 하지만 보통 더 많은 메모리가 필요하다.

 

밉맵 집합 생성

 

    다음 예제는 IDirect3DDevice9::CreateTexture 메서드를 사용해서 5 레벨의 밉맵 체인─256×256, 128×128, 64×64, 32×32, 16×16─을 만든다.

//m_pD3DDevice는 IDirect3DDevice9 인터페이스에 대한 유효한 포인터라고 가정

 

IDirect3DTexture9 * pMipMap;

m_pD3DDevice->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8,

    D3DPOOL_MANAGED, &pMipMap);

처음 2개의 매개변수는 1단계 텍스처의 크기와 너비, 3번째 매개변수는 텍스처 내 레벨의 수─0이면, D3D는 가장 작은 크기인 1×1까지 2의 거듭제곱만큼의 차이로 표면들의 체인을 만든다─다. 4번째와 5번째 매개변수는 각각 이 리소스의 사용법─0이면, 특별한 방법을 지정하지 않는다─ 및 텍스처의 표면 포맷─D3DFORMAT 열거형의 값─이다. 6번째 매개변수는 생성된 리소스를 위치시킬 메모리 클래스를 가리키는 D3DPOOL 열거형 값이다. 동적 텍스처를 사용한다면, D3DPOOL_MANAGED가 적절하다. 마지막 매개변수는 IDirect3DTexture9 인터페이스에 대한 포인터의 주소다.

 

참고    밉맵 체인 내 각 표면의 차원은 이전 표면의 절반이다. 즉 1단계 밉맵이 256×128이라면, 뒤따르는 밉맵은 각각 128×64, 64×32, ..., 1×1이다. 또한 밉맵의 너비 또는 높이가 1보다 작은 레벨은 있을 수 없다. 즉 1단계 밉맵 표면이 4×2라면, 뒤따르는 밉맵은 각각 2×1, 1×1로 총 레벨의 수는 3개까지다.

 

밉맵 선택과 표시

 

    밉맵 텍스처 집합을 현재 텍스처 목록의 첫번째 텍스처로 설정하려면 IDirect3DDevice9::SetTexture 메서드를 사용한다. 세부사항은 Texture Blending을 참고한다.

    밉맵 텍스처 집합을 선택한 후, 값들을 D3DTEXTUREFILTERTYPE 열거형의 D3DSAMP_MIPFILTER로 할당해야 한다. 그러면 D3D는 자동으로 밉맵 텍스처 필터링을 수행한다.

m_pD3DDevice->SetTexture(0, pMipMap);

m_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

아니면 IDirect3DTexture9::GetSurfaceLevel 메서드를 사용하고 반환할 밉맵 레벨을 지정함으로써 직접 밉맵 표면 체인을 traverse할 수도 있다. 아래 코드는 높은 해상도 순으로 밉맵 체인을 traverse한다.

IDirect3DSurface9 * pSurfaceLevel;

for (int iLevel = 0; iLevel < pMipMap->GetLevelCount(); iLevel++)

{

    pMipMap->GetSurfaceLevel(iLevel, &pSurfaceLevel);

    // 레벨 처리

    pSurfaceLevel->Release();

}

비트맵 데이터를 체인의 각 표면으로 로드하려면 직접 밉맵 체인을 traverse해야 한다. 이것이 전형적으로 체인을 traverse하는 유일한 이유다. 밉맵의 레벨 수를 반환하려면 IDirect3DBaseTexture9::GetLevelCount를 사용한다.

 

[원문: msdn, Texture Filtering with Mipmaps]


'Study > Directx 9' 카테고리의 다른 글

D3DXMatrixLookAtLH  (0) 2009.10.26
알파블렌드와 알파테스트  (0) 2009.09.02
알파 메쉬 랜더링 - 참고자료  (0) 2009.09.02
dx 텍스쳐 저장  (0) 2009.07.13
밉맵 필터링  (0) 2009.06.26
텍스쳐 렌더링  (0) 2009.06.26
Posted by 붕대마음

댓글을 달아 주세요

모니터에 출력하기 위한 하드웨어의 구성을 살펴보면 버스, 그래픽 프로세서,
비디오 메모리 + 프레임 버퍼, 비디오 제어기 등으로 구성되어 있다.
비디오 제어기는 프레임버퍼에 저장되어 있는 픽셀정보를 이용해서 화면에 색상을 표현하는데
이러한 픽셀은 장차 모니터로 출력될 그래픽 프로세서가 처리한 결과물이다.

OpenGl에서는 프레임 버퍼의 구성이 Front Buffer, Color Buffer, Depth Buffer,
Stencil Buffer, Accumlation Buffer, Auxiliary Buffer등으로 구성되어 있는데
이중에서 Direct3D는 전면버퍼와 색상버퍼, 깊이버퍼, 스텐실 버퍼만이 존재한다.

서피스는 처음에는 픽셀의 집합정도로 사용되다가 3D로 와서
좀 더 확장되어 색상뿐만 아니라 깊이 버퍼와 스텐실 버퍼의 자료를 저장하는
공간을 가리키기도 하게 되었다.
좁은 의미로 서피스는 픽셀을 저장하는 버퍼로 사용된다.

Direct3D는 후면버퍼를 구성하고 있는 색상버퍼, 깊이버퍼, 스텐실 버퍼를
Render Target, Z-Buffer, Stencil Buffer로 부르고 있는데 이 버퍼의 내용을 가져오기 위해서는
서피스를 얻어와야 한다.

또한 Direct3D Texture에서도 서피스를 가져올 수 있어서 Direct3D는 후면버퍼의 Render Target을
Texture의 서피스로 대치가 가능해서 중간 과정을 거치지 않고도 직접 텍스쳐에 렌더링이 가능하다.

또한 텍스쳐에 렌더링을 하게 되면 이 텍스쳐를 포함한 폴리곤을 변형해서 화면 왜곡을
연출하거나 거울의 반사효과와 같은 환경맵핑과 블러링과 같은 컬러에 대한 이미지 조작을
직접 할 수 있는 Post Effect등에 활용될 수 있다.

'Study > Directx 9' 카테고리의 다른 글

D3DXMatrixLookAtLH  (0) 2009.10.26
알파블렌드와 알파테스트  (0) 2009.09.02
알파 메쉬 랜더링 - 참고자료  (0) 2009.09.02
dx 텍스쳐 저장  (0) 2009.07.13
밉맵 필터링  (0) 2009.06.26
텍스쳐 렌더링  (0) 2009.06.26
Posted by 붕대마음

댓글을 달아 주세요

HDR Cube Map Sample

Study/Graphics / 2009.06.25 09:26

이 예제는 부동소수점 텍스쳐와 높은 동적 범위의 광원과 함께 입방체 환경 맵핑에 대해 말한다.
d3d9에서 텍스쳐를 위해서 부동소수점 포맷이 유용하다.
이 포맷은 빛이 재질에 흡수되는 부분에서 환경맵핑이 된 매시의 좀 더
사실적인 빛 효과를 만들수 있게 하기 위해 1.0보다 큰 색상값을 저장할 수 있도록 한다.

Sample Overview
이 샘플은 두가지의 랜더링 기술(입방체 환경맵핑과 높은 동적 범위 광원)을 보여준다.
1. 입방체 환경맵핑
- 입방체 환경 맵핑은 큐브텍스쳐맵 내부의 하나의 3D 물체의 환경 주위에서 랜더링 되는 기술로서
  해당 물체는 빛이 가미된 효과를 만들기 위해 강한 빛을 계산하는데 메모리를 소모하지 않고
  큐브맵을 사용할 수 있다.

2. HDR
- 높은 동적 범위(HDR) 광원은 부동동소수점 텍스쳐들과 강한 빛들을 통해을 사용하여 높은 컬리티의
  빛효과를 만들어 표현하는 기술이다.
  부동 소수점 텍스쳐 포맷은 d3d0에 소개되어져 있다.
  전통적인 integer포맷 텍스쳐와는 달리 부동 소수점 텍스쳐들은 넓은 범위의 색상값들을 저장할 수 있다.
  그래서 부동소수점 텍스쳐에서의 색상값들은 0~1사이로 클램프된 값을 얻지  않고 실세계에서
  좀 더 빛과 같은 텍스쳐를 사용하여 현실성을 사용할 수 있다.

  HDRCubeMap 몇몇  해당 물체를 다른 주위의 오브젝트들로 환경을 구성하여 장면을 그린다.
  해당 물체는 반사력을 0~1로 조절하여 설정할 수 있고, 0은 빛을 완전히 흡수한다는 뜻이며 1은
  흡수없이 모든 빛을 반사한다는 뜻이다.
  빛들은 장면에서 네개의 점광원으로 구성되어지고 사용자에 의해 가감을 조절할 수 있다.

Implementation
아래와 같은 것으로 장면을 구성할 수 있다.
1. 벽들과 바닥, 천장을 포함하는 하나의 room mesh
2. 빛의 방향을 표시하는 네개의 작은 구 메시들
3. 환경맵을 적용된 room의 중앙에 위치한 단일 mesh
4. 두개의 비행 mesh. 이들의 궤도는 환경매핑된 mesh의 주위를 돌며 환경맵에 반사되어진다.
   이들은 시각적으로 환경맵이 동적이고 주위환경의 변화에 따라 바뀐다는 것을 보여준다.

샘플을 로드하면 두개의 입방체 텍스쳐가 생성되어져 있고 하나는 A8R8G8B8 포맷이며 다른 하나는 A16B16G16R16F 포맷이다.
랜더링시 사용자의 선택에근거하여 환경맵을 구성한다.
이 샘플은 HDR빛을 사용할 시 정수와 부동소수점 텍스쳐 사이의 다른점을 보여준다.
스텐실 표면과 동일한 크기의 큐브텍스쳐 표면또한 생성되어 진다.
카메라는 CModelViwerCamera을 쓴다.
이 카메라는 항상 원점(환경매핑된 mesh)을 바라본다.
사용자는 카메라의 위치를 mesh주위로 이동하거나 회전할수 있다.
카메라는 환경매핑된 메시의 world 행렬뿐 아니라view와 projection 행렬에 의해서도 계산되어져 랜더링 된다.

The Rendering Code
세계의 핵심 함수 : RenderSceneIntoCubeMap, Render, RenderScene
                          그리고 vs와 ps.

RenderScene은 현재 렌더타겟의 장면을 실제로 렌더링 한다.
이 함수는 큐브텍스쳐와 디바이스 백버퍼에서의 장면 렌더 두 곳에서 호출되어 진다.
세개의 인자(뷰행렬, 프로젝션행렬, 환경매핑으로 그려질 것인지의 여부 플래그)를 받는다.
bool 플래그가 필요한 이유는 환경맵일 경우에는 환경매핑된 메쉬는 그려지지 않기 때문이다.
나머지 함수들은 그대로 하면 된다.
만약 처음이라면 뷰 공간의 빛의 위치뿐 아니라 가장 최근에 변환된 행렬들과 effec 오브젝트들을 업데이트 한다.
그러고 나서 장면에 있는 모든 오브젝트들을 각각에 연결된 테크닉으로 렌더링 한다.

RenderSceneIntoCubeMap은 전체 장면을 큐브텍스쳐에 랜더링 한다.
처음으로 현재 랜더 타겟과 스텐실 버퍼를 저장하고 스텐실버퍼 디바이스로서 큐브텍스쳐를 위해 스텐실 서페이스를 설정한다.
다음으로 여섯개의 면을 되풀이 한다.
각 면은 랜더타겟으로 면 서페이스를 설정한다.
그런 다음에   특별한 면, 큐브면에서 정점을 향하고 있는 카메라를 사용하기 위해 뷰 행렬을 계산한다.
그 후에는 false로 지정한  bRenderEnvMappedMesh 인자, 뷰와 프로젝션행렬과 함께 RenderScene함수를 호출한다.
이 프로젝션 행렬은 90도 각도의 뷰와 1도의 비율을의 하나의 정사각형을 가진다.  
여섯면 모두 처리가 끝난고, 이전 렌더타겟과 스텐실 버퍼를 복구시킨다.
현재 프레임을 위한 환경맵이 다 만들어 졌다.

Render는 최상위 렌더링 함수로서 매프레임마다 DXUT에 의해 불려진다.
처음으로 카메라 오브젝트를 갱신을 위해 FrameMove를 호출하여 카메라에 의해 업데이트하여 관리되어 진다.
다음으로 해당프레임에서 환경을 반사시키는 큐브텍스쳐를 구성하기 위해 RenderSceneIntoCubeMap를 호출한다.
그 후에 카메라로 부터의 뷰,프로젝션 행렬과 함께 RenderScene를 호출하여 장면을 그리고 bRenderEnvMappedMesh가
true로 설정된다.

The Shader
ss






참고 : http://en.wikipedia.org/wiki/High_dynamic_range_rendering

'Study > Graphics' 카테고리의 다른 글

not use lock, unlock version font system  (0) 2009.08.24
shader에서의 dword  (0) 2009.08.15
float4에 마지막 w의 값...1이냐 0이냐....  (0) 2009.08.11
shader SetValue  (0) 2009.08.08
Directx9 셰이더 프로그래밍 예제 수정방법.  (4) 2009.07.13
HDR Cube Map Sample  (0) 2009.06.25
Posted by 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함