728x90

※ 제 개인 공부이므로 풀 소스 코드는 작성하지 않습니다.

※ 생략 되어 있는 부분이 많습니다.

struct VtxDUV1
 {
   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이 추가 되었다.

 

*shader.fx*

 

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 함수를 통해 텍스처를 적용하고 랜더링 한다.

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침