개요

사각형 텍스쳐가 왼쪽상단 vertex 색은 빨강, 오른쪽상단 vertex 색은 초록이다.

이 사각형을 2배 확대했다.

중간 사이의 픽셀의 색은 어떻게 채울까?


d3d11 SamplerState

유한 크기의 픽셀 배열인 텍스쳐에서 컬러를 추출해 uv 좌표에 대응하는 작업

SamplerState는 유한한 픽셀 크기를 가질 수 밖에 없는 텍스쳐의 각 픽셀 사이를 어떻게 처리할지 결정하는 State다.


표본 추출기(Sampler) 서술자 구조체 세팅

    //기본 샘플러 값
    samplerDesc.Filter = D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR;
    samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
    samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
    samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;

SamplerDesc 구조체 멤버 중 텍스쳐 Filter, AddressU의 타입에 대해 공부해보자.

우선 dx에서 텍스쳐를 의미하는 용어부터 보자.


ShaderResourceView(SRV)

dx에서 텍스쳐를 말한다.

dx에서 View는 서술자와 동의어다.

파일로부터 ID3D11ShaderResourceView를 생성해야 DirectX에게 텍스쳐를 그리라고 명령할 수 있게 된다.


Filter

type: D3D11_FILTER

텍스쳐를 sampling 할 때 사용할 필터링 방법.

D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR 등 이름이 긴 타입들이 있다.

msdn에 있는 설명을 하나씩 요약해보면,


_POINT - 끊어지는 듯한 이미지

  • 픽셀 하나하나 색상이 독립적

_LINEAR - 부드러운 이미지를 얻음 (선형 보간)

  • 점과 점 사이 중간 지점의 색상을 추출
  • 예를 들어, 통상적으로 마젠타 색상을 빼고 렌더링 한다고 했을 때, 선형 보간하면 마젠타의 중간 지점색상이 섞여 나온다.

MIN - Minification 축소

MAG - Magnification 확대

MIP - Mip-mapping 밉맵

  • 밉 레벨 샘플링
  • 최적화된 이미지 시퀀스. 렌더링 할 때 시간과 처리 성능을 줄여주는 요소


예를 들어 D3D11_FILTER_MIN_MAG_MIP_POINT 는 확대, 축소, 밉맵 간 필터 처리 전부 POINT 방식이다.

하지만 내가 만든 게임 구현 시에는 어떤 타입을 써도 체감이 안 되어 연구가 더 필요하다.


AddressU, V, W

type: D3D11_TEXTURE_ADDRESS_MODE

0~1 범위 밖에 있는 a v 텍스쳐 좌표를 해결하는 데 사용

D3D11_TEXTURE_ADDRESS_WRAP

  • 모든 u, v 접합에서 텍스쳐가 반복된다.
  • 0~1, 1~2 반복된 동일 텍스쳐

D3D11_TEXTURE_ADDRESS_MIRROR

  • uv 좌표가 범위를 벗어나면 텍스쳐를 뒤집는다.
  • 0~1은 정상, 1~2는 뒤집힌 이미지, 2~3은 정상, …

D3D11_TEXTURE_ADDRESS_CLAMP

  • uv 좌표가 범위를 벗어나면 끝 좌표의 픽셀이 반복된다.
  • 0 미만 시 0,0 텍스쳐 색상, 1 초과 시 1,0 텍스쳐 색상

D3D11_TEXTURE_ADDRESS_BORDER

  • uv 좌표가 범위를 벗어나면 D3D11_SAMPLER_DESC 혹은 HLSL 코드에 지정된 테두리 색상으로 설정된다.

D3D11_TEXTURE_ADDRESS_MIRROR_ONCE

  • MIRROR + CLAMP
  • 텍스쳐 좌표의 절대값을 취한 다음 최대값으로 고정함


Texture.hlsl code

픽셀쉐이더 진입 함수

float4 PS(PixelInput input) : SV_TARGET //SV_TARGET 은 타겟이될 색깔 
{
    float4 TextureColor =
    // 매핑된 좌표로 텍스쳐 로드
    Texture.Sample(Sampler, input.uv);
    // [생략]...
}

렌더링 파이프라인 PS 단계에서 Sample 코드를 끝으로 준비 완료

말로만 하고 글로만 쓰니 제대로 이해하기 힘들다.

직접 텍스쳐를 정해 uv를 점차 증감해보자.


Example: Background Scrolling


참고

MSDN

Toymaker

댓글남기기