8. 텍스처를 입혀보자. (지구)
※ 제 개인 공부이므로 풀 소스 코드는 작성하지 않습니다. ※
※ 생략 되어 있는 부분이 많습니다. ※
{
D3DXVECTOR3 p;
DWORD d;
FLOAT u, v;
VtxDUV1() : p(0, 0, 0), d(0xFFFFFFFF) {}
VtxDUV1(FLOAT X, FLOAT Y, FLOAT Z,
FLOAT U, FLOAT V, DWORD D = 0xFFFFFFFF) : p(X, Y, Z), u(U), v(V), d(D) {}
enum { FVF = (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1), };
};
LPDIRECT3DVERTEXSHADER9 m_pVs; // Vertex Shader
LPDIRECT3DVERTEXDECLARATION9 m_pFVF; // Declarator
LPD3DXCONSTANTTABLE m_pTbl;
VtxDUV1 m_pVtx[4]; // Vertex Buffer
LPDIRECT3DTEXTURE9 m_pTx0;
이번에는 텍스처가 추가 되면서, u,v좌표를 나타낼 float u,v와, FVF의 D3DFVF_TEX1, 그리고 텍스처 데이터가 저장될 LPDIRECT3DTEXTURE9 형의 m_pTbl이 추가 되었다.
float4x4 m_mtWVP; // World * View * Projection Matrix
// For Vertex Processing Output
struct SvsOut
{
float4 Pos : POSITION ; // oPos
float4 Dif : COLOR0 ; // oD0
float2 Tx0 : TEXCOORD0 ; // oT0
};
SvsOut VtxPrc( float3 Pos : POSITION, float4 Dif : COLOR0, float4 Tx0 : TEXCOORD0)
{
SvsOut Out = (SvsOut)0; // Initialized to 0
Out.Pos = mul(float4(Pos, 1), m_mtWVP); // Transform
Out.Dif = Dif;
Out.Tx0 = Tx0;
return Out;
}
텍스처를 나타내는 TEXCOORDO0이 추가 되었다. 그 외에는 이전 내용들과 같다.
m_pVtx[0] = VtxDUV1(-0.95F, 0.95F, 0, 0, 0, D3DXCOLOR(1, 0, 1, 1)); //색깔
m_pVtx[1] = VtxDUV1(0.95F, 0.95F, 0, 1, 0, D3DXCOLOR(1, 1, 0, 1)); //색깔
m_pVtx[2] = VtxDUV1(0.95F, -0.95F, 0, 1, 1, D3DXCOLOR(0, 1, 1, 1)); //색깔
m_pVtx[3] = VtxDUV1(-0.95F, -0.95F, 0, 0, 1, D3DXCOLOR(1, 1, 1, 1)); //색깔(하얀색)
D3DXCreateTextureFromFile(m_pdev, "Texture/earth.bmp", &m_pTx0);
D3DXCreateTextureFromFile 함수를 사용해서 텍스처 이미지를 읽어온다.
현재 작성대로의 정점들의 색깔로 지정하고 텍스처와 함께 랜더링 하면 왼쪽
정점들의 색깔을 모두 하얀색으로 하면 오른쪽과 같이 나온다.
Render()
D3DXMATRIX mtWld; // World Matrix
D3DXMATRIX mtViw; // View Matrix
D3DXMATRIX mtPrj; // Projection Matrix
D3DXMatrixIdentity(&mtWld);
m_pdev->GetTransform(D3DTS_VIEW, &mtViw);
m_pdev->GetTransform(D3DTS_PROJECTION, &mtPrj);
m_pdev->SetRenderState(D3DRS_LIGHTING, FALSE);
m_pdev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_pdev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pdev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
// Render
m_pdev->SetVertexShader(m_pVs);
m_pdev->SetVertexDeclaration(m_pFVF);
// Setup Constant Register
D3DXMATRIX mtWVP = mtWld * mtViw * mtPrj;
m_pTbl->SetMatrix(m_pdev, "m_mtWVP", &mtWVP);
m_pdev->SetTexture(0, m_pTx0);
m_pdev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, m_pVtx, sizeof(VtxDUV1));
m_pdev->SetVertexShader(NULL);
m_pdev->SetVertexDeclaration(NULL);
텍스처를 사용하기때문에. SetSamplerState 함수를 통해 필터링 보간을 해준다. 여기선 종류를 보여주기 위해 3개를 다 작성한것 같다. 이후엔 똑같이 변환 과정과, SetTexture 함수를 통해 텍스처를 적용하고 랜더링 한다.