※ 제 개인 공부이므로 풀 소스 코드는 작성하지 않습니다. ※
※ 생략 되어 있는 부분이 많습니다. ※
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가 추가 되었다.
// 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개 이다.
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축에 대해 회전값을 설정해주고 계속 해서 호출해주면서 계속 세 개의 축을 기준으로 회전하게 되는 사각형을 만들게 된다.
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 함수를 이용하여 인덱스와, 정점 데이터를 통한 사각형을 그려준다.
'Shader' 카테고리의 다른 글
9. 안개 효과를 내보자. (0) | 2017.02.06 |
---|---|
8. 텍스처를 입혀보자. (지구) (0) | 2017.02.06 |
6. 알록달록 사각형을 돌려보자.(변환) (0) | 2017.02.03 |
5. 알록달록 삼각형을 그려보자.(Semantic 시맨틱2) (0) | 2017.02.03 |
4. 보라색 삼각형을 그려보자.(Semantic 시맨틱) (0) | 2017.02.03 |