Mipmap Texture

Date:     Updated:

카테고리:

태그:

홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.


🐥 Mipmap

MipMap_Example_STS101

Mipmap이란 원본 텍스쳐를 다양한 해상도로 미리 준비한 텍스쳐의 집합이다. 굳이 높은 해상도의 텍스쳐를 사용할 필요가 없는 경우(LOD), 낮은 해상도의 텍스쳐를 사용해 메모리와 연상량을 모두 절약할 수 있다.


Mipmap_Aliasing_Comparison

또한 카메라와의 거리가 멀어질수록 높은 해상도에 따른 aliasing 현상이 두드러진다. 이때 Mipmap과 LOD 기법을 이용하여 이러한 현상을 방지할 수 있다.


🐥 Create Mipmap Texture

ComPtr<ID3D11Texture2D> stagingTexture = CreateStagingTexture(device, context, width, height, image);

D3D11_TEXTURE2D_DESC txtDesc;
// ..
txtDesc.MipLevels = 0;
txtDesc.Usage = D3D11_USAGE_DEFAULT;
txt.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS;

// 초기 데이터 없이 texture2d 생성
device->CreateTexture2D(&txtDesc, nullptr, texture.GetAddressOf());

// 원본 texture(staging texture) 복사
context->CopySubresourceRegion(texture.Get(), 0, 0, 0, 0, stagingTexture.Get(), 0, nullptr);

device->CreateShaderResourceView(texture.Get(), 0, textureResourceVuew.GetAddressOf());

// 해상도 낮춰가며 밉맵 생성
context->GenerateMips(textureResourceView.Get());
  • 임시 텍스쳐(staging texture) 만들기
  • Usage를 D3D11_USAGE_STAGING인 줄 알았는데 GPU->CPU가 아니기 때문에 DEFAULT
  • MipLevels = 0 : 해상도 1x1 될 때까지 최대한 많은 mipmap 생성
  • MiscFlags에서 generate_mips 지정


SubResource

Resource SubResource
1 2
  • Mipmap사용 시 Resource는 mipmap을 묶어서 array index로 들고다님
  • SubResource는 resource 내 하나하나에 대한 접근


🐥 Using Mipmap Texture

// ...

PixelShaderOutput main(PixelShaderInput input)
{
  // ...
  float dist = length(eyeWorld - input.posWorld);
  float distMin = 5.0;
  float distMax = 10.0;
  float lod = 8.0 * saturate(dist - distMin / (distMax - distMin));

  dffuse *= g_texture0.SampleLevel(g_sampler, input.texcoord, lod);

  // ...
}
  • Mipmap 사용시 Sampler대신 SampleLevel 사용
  • 거리에 따라 lod 단계를 정해주고 SampleLevel(sampler, texcoord, lod단계)


🐥 Results

ezgif com-crop (1)



맨 위로 이동하기

Graphics 카테고리 내 다른 글 보러가기

댓글 남기기