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

셰이더 파일은 몇개의 명령을 포함하고 있다. 거기에 따라, 다음과 같이 개체에 텍스처가 맵핑 된다.

텍스처를 맵핑 한 개체



© 2002 Microsoft Corporation. All rights reserved.
↑TOP