728x90

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

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

 

 

struct VtxIdx
 {
      WORD a, b, c;

      VtxIdx() : a(0), b(1), c(2) {}
      VtxIdx(WORD A, WORD B, WORD C) : a(A), b(B), c(C) {}
 };

 

 struct VtxD
 {
      D3DXVECTOR3 p;
      DWORD d;

      VtxD() : p(0, 0, 0), d(0xFFFFFFFF) {}
      VtxD(FLOAT X, FLOAT Y, FLOAT Z, DWORD D) : p(X, Y, Z), d(D) {}
      enum { FVF = (D3DFVF_XYZ | D3DFVF_DIFFUSE), };
 };

 

LPDIRECT3DVERTEXSHADER9  m_pVs;    // Vertex Shader
LPDIRECT3DVERTEXDECLARATION9  m_pFVF;    // Declarator

LPD3DXCONSTANTTABLE  m_pTbl;

D3DXMATRIX  m_mtWld;   // World Matrix

 

VtxIdx  m_pIdx[12];   // Index Buffer
VtxD  m_pVtx[24];   // Vertex Buffer

 

이번엔  m_pldx의 인덱스 버퍼와, 인덱스 구조체인 VtxIdx가 추가 되었다.

 

*shader.fx*

 

// Output Vertex Processing(Output Register)
struct SvsOut
{
    float4 Pos : POSITION; // oPos
    float4 Dif : COLOR0; // oD0
};


float4x4 m_mtWld;   // World Matrix
float4x4 m_mtViw;   // View Matrix
float4x4 m_mtPrj;   // Projection Matrix


SvsOut VtxPrc( float3 Pos : POSITION, float4 Dif: COLOR0 )
{
     float4 P;

     SvsOut Out = (SvsOut)0;    // Initialized to 0

 

     P = float4(Pos, 1);     // Expand intto float4 and Setting w=1
     P = mul(P, m_mtWld);    // Transform World
     P = mul(P, m_mtViw);    // Transform View
     P = mul(P, m_mtPrj);    // Transform Projection

 

     Out.Pos = P;      // Copy to Output Register Position
     Out.Dif = Dif;      // Copy to Output Register Diffuse

 

     return Out;
}

 

입력받는 정점좌표와, 색상 데이터를 이용하여 출력 해주는 것은 여태까지와 똑같다 다만 추가 된것은 월드, 뷰, 투영 행렬을 mul 함수를 이용하여 각각 적용해주면서 변환 화는 과정을 보여주고 있다.

 

                             -----정점 데이터-----

// front
 m_pVtx[0] = VtxD(-1.f, -1.f, -1.f, D3DXCOLOR(1.0F, 0.0F, 0.0F, 1.0F));
 m_pVtx[1] = VtxD(-1.f, 1.f, -1.f, D3DXCOLOR(0.0F, 1.0F, 0.0F, 1.0F));
 m_pVtx[2] = VtxD(1.f, 1.f, -1.f, D3DXCOLOR(0.0F, 0.0F, 1.0F, 1.0F));
 m_pVtx[3] = VtxD(1.f, -1.f, -1.f, D3DXCOLOR(1.0F, 0.0F, 1.0F, 1.0F));

 

 // back
 m_pVtx[4] = VtxD(-1.f, -1.f, 1.f, D3DXCOLOR(1.0F, 1.0F, 0.0F, 1.0F));
 m_pVtx[5] = VtxD(1.f, -1.f, 1.f, D3DXCOLOR(0.0F, 1.0F, 1.0F, 1.0F));
 m_pVtx[6] = VtxD(1.f, 1.f, 1.f, D3DXCOLOR(1.0F, 0.0F, 0.0F, 1.0F));
 m_pVtx[7] = VtxD(-1.f, 1.f, 1.f, D3DXCOLOR(1.0F, 0.0F, 1.0F, 1.0F));

 

 // top
 m_pVtx[8] = VtxD(-1.f, 1.f, -1.f, D3DXCOLOR(0.0F, 0.0F, 1.0F, 1.0F));
 m_pVtx[9] = VtxD(-1.f, 1.f, 1.f, D3DXCOLOR(0.0F, 1.0F, 0.0F, 1.0F));
 m_pVtx[10] = VtxD(1.f, 1.f, 1.f, D3DXCOLOR(1.0F, 0.0F, 1.0F, 1.0F));
 m_pVtx[11] = VtxD(1.f, 1.f, -1.f, D3DXCOLOR(0.0F, 1.0F, 1.0F, 1.0F));

 

 // bottom
 m_pVtx[12] = VtxD(-1.f, -1.f, -1.f, D3DXCOLOR(1.0F, 1.0F, 0.0F, 1.0F));
 m_pVtx[13] = VtxD(1.f, -1.f, -1.f, D3DXCOLOR(0.0F, 1.0F, 0.0F, 1.0F));
 m_pVtx[14] = VtxD(1.f, -1.f, 1.f, D3DXCOLOR(0.0F, 0.0F, 1.0F, 1.0F));
 m_pVtx[15] = VtxD(-1.f, -1.f, 1.f, D3DXCOLOR(1.0F, 0.0F, 0.0F, 1.0F));

 

 // left
 m_pVtx[16] = VtxD(-1.f, -1.f, 1.f, D3DXCOLOR(1.0F, 1.0F, 0.0F, 1.0F));
 m_pVtx[17] = VtxD(-1.f, 1.f, 1.f, D3DXCOLOR(1.0F, 0.0F, 1.0F, 1.0F));
 m_pVtx[18] = VtxD(-1.f, 1.f, -1.f, D3DXCOLOR(0.0F, 1.0F, 1.0F, 1.0F));
 m_pVtx[19] = VtxD(-1.f, -1.f, -1.f, D3DXCOLOR(1.0F, 0.0F, 1.0F, 1.0F));

 

 // right
 m_pVtx[20] = VtxD(1.f, -1.f, -1.f, D3DXCOLOR(1.0F, 1.0F, 0.0F, 1.0F));
 m_pVtx[21] = VtxD(1.f, 1.f, -1.f, D3DXCOLOR(0.0F, 1.0F, 0.0F, 1.0F));
 m_pVtx[22] = VtxD(1.f, 1.f, 1.f, D3DXCOLOR(1.0F, 0.0F, 1.0F, 1.0F));
 m_pVtx[23] = VtxD(1.f, -1.f, 1.f, D3DXCOLOR(0.0F, 0.0F, 1.0F, 1.0F));

 

                            -----인덱스 데이터-----

 

// front
 m_pIdx[0] = VtxIdx(0, 1, 2);
 m_pIdx[1] = VtxIdx(0, 2, 3);

 

 // back
 m_pIdx[2] = VtxIdx(4, 5, 6);
 m_pIdx[3] = VtxIdx(4, 6, 7);

 

 // top
 m_pIdx[4] = VtxIdx(8, 9, 10);
 m_pIdx[5] = VtxIdx(8, 10, 11);

 

 // bottom
 m_pIdx[6] = VtxIdx(12, 13, 14);
 m_pIdx[7] = VtxIdx(12, 14, 15);

 

 // left
 m_pIdx[8] = VtxIdx(16, 17, 18);
 m_pIdx[9] = VtxIdx(16, 18, 19);

 

 // right
 m_pIdx[10] = VtxIdx(20, 21, 22);
 m_pIdx[11] = VtxIdx(20, 22, 23);  

 

정점 데이터, 인덱스 데이터 설정, 사각형은 앞,뒤,위,아래,왼쪽,오른쪽 총 6면이고,

면당 삼각형 2개(정점 4개)이므로 정점 데이터는 6 x 4 = 24개, 인덱스 데이터는 6 x 2 =12개 이다.

 

update()

 

D3DXMATRIX mtRotX;   // Rotation Matrix X
D3DXMATRIX mtRotY;   // Rotation Matrix Y
D3DXMATRIX mtRotZ;   // Rotation Matrix Z

 

        // 회전하는 월드 행렬 구성
FLOAT  fAngle = D3DXToRadian(GetTickCount() * 0.1f);
D3DXMatrixRotationY(&mtRotY, fAngle*1.f);
D3DXMatrixRotationZ(&mtRotZ, fAngle*1.f);
D3DXMatrixRotationX(&mtRotX, fAngle*1.f);

 

m_mtWld = mtRotY * mtRotZ * mtRotX;
m_mtWld._42 = 40.f;
m_mtWld._43 = -30.f;

 

 

월드 행렬에 X축, y축, Z축에 대해 회전값을 설정해주고 계속 해서 호출해주면서 계속 세 개의 축을 기준으로 회전하게 되는 사각형을 만들게 된다.

 

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);


// Render
m_pdev->SetVertexShader(m_pVs);
m_pdev->SetVertexDeclaration(m_pFVF);

 

// 상수 연결: 상수 테이블 사용
m_pTbl->SetMatrix(m_pdev, "m_mtWld", &m_mtWld);
m_pTbl->SetMatrix(m_pdev, "m_mtViw", &mtViw);
m_pTbl->SetMatrix(m_pdev, "m_mtPrj", &mtPrj);

 

m_pdev->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 24, 12, m_pIdx, D3DFMT_INDEX16, m_pVtx, sizeof(VtxD));

 

m_pdev->SetVertexShader(NULL);

 

 

셰이더 파일에 있는 m_mtWld(월드 행렬), m_mtViw(뷰 행렬), m_mtPrj(투영 행렬)에 각각 상수 테이블을 이용하여 설정해주고.

 

DrawIndexedPrimitiveUP 함수를 이용하여 인덱스와, 정점 데이터를 통한 사각형을 그려준다.

728x90
Posted by 정망스
,


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