ch6 :: 텍스처링 Radiance team
턱스처링 개요 텍스처 매핑 :: - 이미지 테이터를 삼각형에 입힐 수 있게 하는 테크닉 - 세밀함, 사실감 높여줌 - IDirect3DTexture9 인터페이스 사용
6.1 텍스처 좌표 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 필터 선형 샘플링(Linear filtering) 근접점 샘플링(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 밉맵 필터 밉맵 필터 지정 Filter부분 옵션 - D3DTEXF_NONE :: 밉맵 이용하지 않음 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);