C++ Algorithm & Study/Game Math & DirectX 11

[Direct11] 17. Direct3D Texture - Filter & Mode

GameChoi 2023. 6. 16. 20:25

1. Direct3D Texture

1.1 Filter

1.1.1 Magnification

 - 모니터의 해상도가 1024 ✕ 1024, Texture의 해상도가 256 ✕ 256인 경우 Texture로 부터 확대가 일어남

   - 적은 수의 텍셀들로 더 많은 수의 픽셀들을 채워야 함

     - 각 픽셀에는 정점 Texture 좌표를 삼각형을 따라 보간해서 결정된 고유한 Texture 좌표가 부여

       - 텍셀 점과 정호가히 일치하지 않는 Texture 좌표를 가진 픽셀들이 존재

         - 따라서 픽셀 부근에 있는 텍셀들의 색들을 보간해야하는데 그것을 상수 보간 & 선형 보간이라 부름

1.1.2 Minification

 - 너무 많은 텍셀들이 너무 적은 픽셀들에 사상되는 것

   - 위의 예시와 반대로 설정되게 된다면 픽셀의 Texture  좌표가 Texture Map의 어떤 텍셀 점과도 일치X

     - 상수 보간 필터링 & 선형 보간 필터링 적용

   - 위 필터링 이외의 처리가 가능

     - 256 ✕ 256 텍셀 크기의 맵을 평균 하향표본화를 통해 더 작은 맵으로 줄일 수 있음

       - 축소를 효율적으로 하지만 메모리는 조금 더 사용하는 밉매핑 방식 사용 (렌더링 이전에 미리 수행)

1.1.3 Anisotropic

 - 다각형의 법선 벡터와 카메라의 시선 벡터 사이의 각도가 클 때 발생하는 왜곡 현상이 완화

   - 비용이 크지만 왜곡에 의한 결함을 제거함으로써 품질이 크게 향상

1.2 Mode

 - 함수의 정의역 바깥의 좌표가 주어졌을 때의 처리방식 - 좌표 지정 모드(Address Mode)

   - Wrap, Border Color, Clamp, Mirror 4가지 존재

1.2.1 Wrap

 - 이미지가 정수 경계마다 반복

   - Texture를 일정한 표면에 반복해서 깔 수 있음, 타일링이라는 기법 사용

     - 추가적인 자료 없이 Texture의 해상도를 높이는 효과, Texture의 이음매가 없도록 하는 것

SamplerState samTriLinear { Filter = MIN_MAG_MIP_LINEAR; AddressU = WRAP; AddressV = WRAP; }

1.2.2 Border Color

 - 바깥의 Texture 좌표가 입력되면 Texture 함수는 프로그래머가 지정한 색을 사용

SamplerState samTriLinear { Filter = MIN_MAG_MIP_LINEAR AddressU = BORDER; AddressV = BORDER; }

1.2.3 Clamp

 - Texture 함수는 바깥의 좌표에 대해 색을 돌려줌

SamplerState samTriLinear { Filter = MIN_MAG_MIP_LINEAR AddressU = CLAMP; AddressV = CLAMP; }

1.2.4 Mirror

 - 이미지가 각 정수 경계마다 반사, 즉 반대 방향으로 반복

SamplerState samTriLinear { Filter = MIN_MAG_MIP_LINEAR AddressU = MIRROR; AddressV = MIRROR; }

1.3 Sampler State

1.3.1 Fixel Shader

 - 위에서 설명한 내용을 토대로 필터들을 적용하기 위해 사용

   - 축소, 확대, 밉맵에 대해 선형 필터링 적용

SamplerState mySamplerO { Filter = MIN_MAG_MIP_LINEAR; }

   - 축소에 대해 선형 필터링, 확대와 밉맵에 대해 점 필터링 사용

SamplerState mySamplerl { Filter = MIN_LINEAR_MAG_MIP_POINT; }

   - 축소 및 밉맵에 대해 점 필터링, 확대에 대해 선형 필터링

SamplerState mySampler2 { Filter = MIN_POINT_MAG_LINEAR_MIP_POINT; }

   - 축소, 확대, 밉맵에 대해 비등방 필터링 사용

SamplerState mySampler3 { Filter = ANISOTROPIC; MaxAnisotropy = 4; }

 - 픽셀 셰이더에서 주어진 픽셀 Texture 좌표를 이용하여 Texture로 부터 하나의 표본을 추출

   - 적절한 표본추출기 선언과 함수 호출이 필요

     - 2차원 Texture를 추출할 때 Sample 함수를 사용

       - 주어진 Sampler State 객체에 지정된 필터링 방법을 이용, Texture 맵의 점에서 추출, 보간한 색상 값을 돌려줌

float4 PS(VertexOut pin, uniform int gLightCount) : SV_Target
{ float4 texColor = gDiffuseMap.Sample(samAnisotropic, pin.Tex); }

 - Texture를 재질과 조명 시스템과 통합할 경우 주변광과 분산광으로 변조하되 반영광으로 변조X