DX9을 이용한 3D Game 프로그래밍 입문 - Part.2 Direct3D 기초 6장

김주현·2021년 11월 2일
0

6장 텍스처링

텍스처 매핑은 임지 데이터를 삼각형에 입힐 수 있게 하는 테크닉이며,장면의 세밀함과 사실감을 극적으로 높여준다.

D3D에서는 IDirect3DTexture9 인터페이스로 텍스처를 표현한다. 텍스처는 픽셀의 매트릭스이며 표면과 비슷하지만 삼각형에 입힐 수 있다.

6.1 텍스처 좌표

D3D는 수평으로 진행하는 u축과 수직으로 진행하는 v축으로 구성된 텍스처 좌표 시스템을 이용한다. U,V 좌표시스템은 텍셀이라 불리는 텍스처의 요소를 표현하는데 사용되는데, v축은 아래쪽이 야의 방향이다.

좌표 간격이 [0,1]로 정규화되어 있음을 주의하자. 이것은 다양한 크기의 텍스처를 D3D에 이용할 수 있게끔 하기 위한 것이다. 우리는 각각의 3D 삼각형에 대해서 텍스처 상의 매핑될 삼각형 영역을 정의해야 한다.

이 과정을위해서 버텍스 구조체에 텍스처 위의 버텍스를 정의하는 텍스처 좌표 쌍을 추가해야한다.

struct Vertex
{
...//기존과 동일
float _u,_v; // 텍스처 좌표
};

const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

버텍스 포맷 기술에 D3DFVF_TEX1을 추가하여 버텍스 구조체에 한 쌍의 텍스처 좌표가 포함되어 있음을 지정하였다.

이제 이 세개의 버텍스 객체로 만들어지는 삼각형들은 텍스처 좌표에서의 텍스처 삼각형으로도 정의 된다.

-NOTE-
대응되는 텍스처 삼각형을 3D 삼각형으로 지정하기는 했지만 3D삼각형을 스크린 스페이스로 변환하는 래스터라이즈 단계 전까지는 텍스처가 입혀지지 않는다.

6.2 텍스처의 작성과 활성화

텍스처 데이터는 일반적으로 디스크에 보관된 이미지 파일에서 읽혀져 IDirect3DTexture9 객체로 로드된다. 이 작업을 위해서는 다음과 같은 D3DX 함수가 사용된다.

HRESULT D3DXCreateTextureFromFile (
LPDIRECT3DDEVICE9 pDevice, //텍스처를 만들어낼 장치
LPCSTR pSrcFile, //이미지를 읽어들일 파일명
LPDIRECT3DTEXTURE9* ppTexture //만들어진 텍스처를 받을 포인터
);

이함수는 다양한 이밎 파일 포맷을 읽어들일 수 있다.
예를 들어,stonewall.bmp라는 파일에서 텍스처를 만들고자 한다면 다음과 같이 코드를 작성하면 된다.

IDirect3Dtexture9* _stonewall;
D3DXCreateTextureFromFile(_device,"stonewall.bmp",&_stonewall);

현재 텍스처를 지정하는 데는 다음과 같은 메서드를 이용한다.

HRESULT IDirect3DDevice9::SetTexture(
DWORD Stage // 0~7 범위의 값으로 텍스철르 지정한다.
IDirect3DBaseTexture9* pTexture // 저장할 텍스처의 포인터
);

Device->SetTexture(0,_stonewall);

-NOTE-
D3D에서는 8개 까지의 텍스처를 결합하여 좀더 자세한 이미지를 만들어낼 수 있다. 이와 같은 테크닉을 멀티 텍스처링이라 한다. 이 책에서는 파트 4전까지 멀티 텍스처링을 이용하지 않아 0을넣는다.

특정한 텍스처링 상태에 텍스처를 이용하지 않고자 한다면 pTexture를 0으로 지정한다.

Device->SetTextur(0,0)
rederObjectWithoutTexture();

6.3 필터

앞서 언급했듰이 텍스처는 스크린 스페이스에서 삼격형에 입혀진다.일반적으로 텍스처와 스크린 삼각형의 크기는 서로 다르다. 텍스처삼각형을 확대또는 축소해서 스크린 삼각형에 맞춘다. 이때 생기는 왜곡을 필터링을 통해 줄이고 부드러운 이미지를 만든다.

D3D는 세가지 필터를 제공하며 각 필터는 다른 수준의 품질을 제공한다. 폼질이 높아질수록 속도는 저하된다. 텍스처 필터를 지정하기 위해서는 IDirect3DDevice9::SetSamplerState를 이용한다.

*근접점 샘플링 - 디폴트 필터링 방식이며 가장 떨어지는 품질 DOWN 속도 UP
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_POINT);
Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_POINT);

*선형 필터링 - 비교적 높은 품질 현재 하드웨어 성능을 고려하면 실행속도 또한 빠른편. 보통 권장되는 필터링
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);

*비등방성 필터링 - 비등방성 필터링은 가장 높은 품질의 결과물을 만들어내지만 실행 속도 또한 가장 느리다.
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_ANISOTROPIC);
Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_ANISOTROPIC);

비등방성 필터링을 이용할때는 품질을 결정하는 D3DSAMP_MAXANISOTROPY 레벨을 지정해야한다. 높은값 = 높은 품질

Device -> SetSamplerState(0,D3DSAMP,MAXANISOTROPY,4);

6.4 밉맵

화면의 삼각형은 텍스처 삼각형과는 크기다 다른것이 일반적. 텍스처 크기를 급격하게 변경하는 것을 막는 테크닉으로 텍스처의 밉맵을 만드는 방법이 있는데 이는 디테일을 보존하면서 여러개의 작은 해상도로 텍스처를 만드는 방식이다.


여기서 각각의 맵맵은 이전 밉맵의 절반 크기임을 확인하자.

6.4.1 밉맵 필터

D3D가 밉맵을 이용하는 방법을 결정하기 위해 밉맵 필터를 지정할 수 있다.

Device->SetSamplerState(0,D3DSAMP_MIPFILTER,Filter);
필터 부분에는 다음 옵션 중 하나를 넣는다.

D3DTEXF_NONE - 밉맵을 이용하지 않는다.
D3DTEXF_POINT - 이 필터를 이용하면 Direct3D는 스크린 삼각형과 가장 비슷한 크기의 밉맵 레벨을 선택한다. 일단 레벨이 선택되면 지정된 min과 mag 태그에 따라 선택된 레벨을 필터링 한다.
*D3DTEXF_LINEAR - 이 필터를 이용하면 Direct3D는 가장 비슷한 두 개의 밉맵 레벨에 min과 mag 필터에 따른 필터링을 적용한다, 즉 선형적으로 조합된 두 개의 레벨을 이용해 최종 픽셀 컬러를 게산해낸다.

6.4.2 D3D에서 밉맵 이용하기

D3D에서의 밉맵 이용은 매우 간단하다. 만약 장치에서 밉맵을 지원한다면 D3DXCreateTextureFromFile을 이용해 자동으로 밉맵 체인을 생성할 수 있다. 게다가 D3D는 스크린 삼각형에 가장 잘맞는 밉맵을 자동으로 선택해준다. 즉,밉맵의 구성과 이용에 필요한 대부분의 과정은 자동으로 처리된다.

6.5 어드레스 모드

텍스처 좌표의범위는 반드시 [0,1]이아니며 떄로는 범위를 넘어날 수 있다. ㅏㅂㅁ위를 넘어서는 텍스처 좌표를 처리하는 방법은 D3D 어드레스 모드에 의해 정의된다. 어드레스 모드에는 wrap,border color, clamp,mirror의 네가지 종류 가있다.

이들그림의 사각형에서 텍스처좌표는 [0,3]으로 표현된다 33 영역 매트릭스로 사각형을 나눌 수 있는데 만약 55를 원한다면 wrap어드레스 모드로 지정하고 텍스처 좌표로 [0,5]를 지정하면된다.

Device- >SetSamplerState() 함수를 통해 어드레스 모드를 지정 할 수 있다.

요약

  • 3D 삼각형에 매핑될 텍스처의 삼각형을 정의하는 데는 텍스처 좌표가 이용된다.

  • D3DXCreateTextureFromFile 함수를 이용해 티스크에 보관된 이미지 파일에서 텍스처를 만들어낼 수 있다.

  • 축소,확대,밉맵 필터 샘플러 상태를 이용하여 텍스처 필터를 지정할 수 있다.

  • 어드레스 모드를 이용하면 [0,1] 범위를 넘어서는 텍스처 좌표의 처리 방법을 지정할 수 있다. 예를 들어, 텍스처를 타일 배치하거나 반사 배치, 혹은 제한하는 등의 처리가 가능하다.

0개의 댓글

관련 채용 정보