directx 9 ch6

Download Report

Transcript directx 9 ch6

ch6 :: 텍스처링
Radiance team
턱스처링 개요
 텍스처 매핑 ::
- 이미지 테이터를 삼각형에 입힐 수 있게 하는 테크닉
- 세밀함, 사실감 높여줌
- IDirect3DTexture9 인터페이스 사용
6.1 텍스처 좌표
 U축 :: 수평으로 진행하는 축
양의 방향 :오른쪽
양의 방향 : 아래족
 v축 :: 수직으로 진행하는 축
 u, v좌표 시스템 :: 텍스처의 요소(텍셀)를 표현하는데 사용
 좌표 간격 (0,1)로 정규화 -> 다양한 크기의 텍스처 이용
 텍스처 상의 매핑 될 삼각형 영역 정의
i) 버텍스 구조체 수정
ii) 텍스처 위의 버텍스 정의하는 텍스처 좌표쌍 추가
- D3DFVF_TEX1을 추가하여 버텍스 구조체에 한쌍의 텍스처
좌표가 포함되어 있음을 지정
6.2 텍스처의 작성과 활성화
 텍스처 데이터 :: 디스크에 보관된 이미지파일에서 읽혀져
IDirect3DTexture9객체로 로드됨
HRESULT D3DXCreateTextureFromFile(
LPDIRECT3DDEVICE9 pDevice,
// 텍스처를 만들어낼 장치
LPCSTR pSrcFile,
// 이미지를 읽어들일 파일명
LPDIRECT3DTEXTURE9* ppTexture // 만들어진 텍스처를 받을 포인터
);
6.2 텍스처의 작성과 활성화
Ex) stonewall.bmp라는 파일에서 텍스처를 만든다
IDirect3Dtexture9* _stonewall;
D3DXCreateTextureFromFile(_device, “stonewall.bmp”, &_stonewall);
• 현재 텍스처를 지정하는 메서드
HRESULT IDirect3Device9::SetTexture(
DWORD Stage, // 0-7범위의 값으로 텍스처를 지정
// stage – 이어지는 노트를 참고한다
IDirect3DBaseTexture9* pTexture // 지정할 텍스처의 포인터
Device->SetTexture(0, _stonewall);
6.3 필터
 텍스처는 스크린 스페이스에서 삼각형에 입혀짐
 텍스처 삼각형과 스크린 삼각형의 크기는 서로 다르다
- 텍스처삼각형이 스크린삼각형보다 작은 경우 : 텍스처삼각형 확대
큰 경우 : 텍스처삼각형 축소
 왜곡발생함 -> 필터링 통해 왜곡 현상 줄임
 품질이 높아질수록 속도 저하
 IDirect3DDevice9::SetSamplerState 이용
6.3 필터
 근접점 샘플링(Nearest point sampling)
- 디폴트 필터링 방식
- 가장 떨어지는 품질, 가장 빠른 속도
Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXT_POINT
Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXT_POINT
• 선형 샘플링(Linear filtering)
- 비교적 높은 품질, 실행속도 또한 빠른편
-보통 선형 필터링을 권장함
Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXT_LINEAR
Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXT_LINEAR
6.3 필터
 비등방성 샘플링(Anisotropic filtering)
- 가장 높은 품질, 실행속도 가장 느림
Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXT_ANISOTROPIC);
Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXT_ANISOTROPIC);
- 필터링의 품질을 경하는 D3DSAMP_MAXANISOTROPY레벨 지정
- 높은 값을 지정할수록 높은 품질
- 값의 범위 : D3DCAPS9구조체를 확인
Device->SetSamplerState(0, D3DSAMP_MINFILTER, 4);
6.4 밉맵
 밉맵 ::
- 텍스처의 크기를 급격하게 변경하는 것을 막는 테크닉
- 디테일을 보존하면서
여러개 작은 해상도로 텍스처 만드는 방식
6.4.1 밉맵 필터
 밉맵 필터 지정
Device->SetSamplerState(0, D3DSAMP_MIPFILTER, Filter);
• Filter부분 옵션
- D3DTEXF_NONE :: 밉맵 이용하지 않음
- D3DTEXF_POINT ::
스크린 삼각형과 가장 비슷한 크기의 밉맵 레벨을 선택
- D3DTEXF_LINEAR ::
가장 비슷한 두개의 밉맵레벨에 min과 mag필터에 따른 필터링 적용
6.4.2 밉맵 이용하기
 D3DXCreateTexureFromFile을 이용해 자동으로 밉맵체인
생성
 밉맵의 구성과 이용에 필요한 대부분 과정은 자동처리
6.5 어드레스 모드
 텍스처좌표의 범위가 (0,1)을 넘어 설 수도 있다
 어드레스 모드 :: wrap, boder, color, clamp, mirror
//wrap
if( ::GetAsyncKeyState(‘W’) & 0x8000f )
{
Device->SetSamplerState (0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
Device->SetSamplerState (0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
}
//border
if( ::GetAsyncKeyState(‘B’) & 0x8000f )
{
Device->SetSamplerState (0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
Device->SetSamplerState (0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
Device->SetSamplerState (0, D3DSAMP_BORDERCOLOR, 0x000000ff);
}
//clamp
if( ::GetAsyncKeyState(‘C’) & 0x8000f )
{
Device->SetSamplerState (0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
Device->SetSamplerState (0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
}
//mirror
if( ::GetAsyncKeyState(‘M’) & 0x8000f )
{
Device->SetSamplerState (0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
Device->SetSamplerState (0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
}