DirectX Graphics 프로그래밍 가이드 프로그래밍 가능한 파이프라인 정점 셰이더 텍스처링 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
이 예에서는, 개체에 텍스처 맵을 적용한다.
정점 데이터에는, 개체의 위치 데이터와 텍스처 좌표 또는 uv 데이터가 포함되어 있다. 이것에 의해 정점 선언의 구조가 바뀐다. 다음의 예에는, 정점 데이터도 나타나고 있다.
struct CUSTOMVERTEX_POS_TEX1 { float x, y, z; // object position data float tu1, tv1; // texture position data }; CUSTOMVERTEX_POS_TEX1 g_Vertices[]= { // x y z u1 v1 { -0. 75f, -0. 5f, 0.0f, 0.0f, 0.0f }, // lower right { 0.25f, -0. 5f, 0.0f, 1.0f, 0.0f }, // lower left { 0.25f, 0.5f, 0.0f, 1.0f, -1. 0f }, // upper left { -0. 75f, 0.5f, 0.0f, 0.0f, -1. 0f }, // upper right }; D3DUtil_CreateTexture( m_pd3dDevice, TEXT("earth.bmp"), &m_pTexture0, D3DFMT_R5G6B5 );
텍스처 이미지를 로드할 필요가 있다. 이 예의 파일 "earth.bmp" 에는 지구의 2D 텍스처 맵이 포함되어 이것이 개체의 채색에 사용된다.
정점 셰이더의 선언에는, 정점의 위치와 텍스처 좌표의 데이터도 반영시킬 필요가 있다.
// Create the shader declaration. D3DVERTEXELEMENT9 decl[] = { { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, { 0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() };
이 선언은, 1 스트림의 데이터를 선언한다. 이것에는, 정점의 위치와 텍스처의 좌표의 데이터가 포함되어 있다.
렌더링 코드는, 데이터 스트림과 셰이더의 장소를 Microsoft® Direct3D® 에게 전한다. 또, 텍스처 맵을 적용하므로, 텍스처 스테이지를 설정한다.
m_pd3dDevice->SetStreamSource( 0, m_pQuadVB, sizeof(CUSTOMVERTEX_POS_TEX1) ); m_pd3dDevice->SetVertexShader( m_pVertexShader ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); m_pd3dDevice->SetTexture( 0, m_pTexture0 ); m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 2 ); m_pd3dDevice->SetTexture( 0, NULL );
텍스처는 1 개 뿐이므로, 텍스처 스테이트 0 의 텍스처 스테이지 스테이트를 설정할 필요가 있다. 이러한 메서드는, 텍셀값을 사용해 개체 정점에 디퓨즈색을 주는 것을 Direct3D 에게 전한다. 즉, 2D 텍스처 맵이 데칼과 같이 적용되게 된다.
셰이더를 다음에 나타낸다.
vs_1_1 // version instruction dcl_position v0 // declare position register dcl_texcoord v8 // declare texture coordinate register def c4, 1, 1, 1, 1 // initialize a constant m4x4 oPos, v0, c0 // transform vertices by view/projection matrix mov oD0, c4 // move diffuse color to output color register mov oT0, v8 // move texture color to output texture register
셰이더 파일은 몇개의 명령을 포함하고 있다. 거기에 따라, 다음과 같이 개체에 텍스처가 맵핑 된다.