Mipmap Texture
카테고리: Graphics
태그: DirectX
홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.
🐥 Mipmap
Mipmap이란 원본 텍스쳐를 다양한 해상도로 미리 준비한 텍스쳐의 집합이다. 굳이 높은 해상도의 텍스쳐를 사용할 필요가 없는 경우(LOD), 낮은 해상도의 텍스쳐를 사용해 메모리와 연상량을 모두 절약할 수 있다.
또한 카메라와의 거리가 멀어질수록 높은 해상도에 따른 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 |
---|---|
- 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
댓글 남기기