CreateVertexBuffer(/*정점 개수 * sizeof(정점타입)*/, 0, /*FVF*/, D3DPOOL_MANAGED, /*정점 버퍼의 주소*/, nullptr);
CreateIndexBuffer(/*인덱스 개수 * sizeof(WORD)*/, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, /*인덱스 버퍼의 주소*/, nullptr);

// D3DFVF_CUSTOMVERTEX는 (D3DFVF_XYZ|D3DFVF_DIFFUSE)를 매크로화 한 것
m_pDevice->CreateVertexBuffer(8 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &m_vb, nullptr);
m_pDevice->CreateIndexBuffer(36 * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_ib, nullptr);

인덱스의 순서는 왼손 좌표계를 사용하기 때문에 CW(시계방향)으로 설정해야 한다.

 

 

VOID* pVerts = nullptr;
m_vb->Lock(0, sizeof(verts), (void**)&pVerts, 0);
memcpy(pVerts, verts, sizeof(verts));
m_vb->Unlock();

VOID* pIndices;
m_ib->Lock(0, sizeof(indices), (void**)&pIndices, 0);
memcpy(pIndices, indices, sizeof(indices));
m_ib->Unlock();

이후 버퍼들을 복사한다. Lock과 Unlock은 반드시 한 쌍을 이루어서 사용해야 한다.

 

 

// 뷰 행렬을 구하기 위한 외부 파라미터
D3DXVECTOR3 eye(0.f, 0.f, -5.f);
D3DXVECTOR3 target(0.f, 0.f, 1.f);
D3DXVECTOR3 up(0.f, 1.f, 0.f);

D3DXMATRIX view;
D3DXMATRIX proj;

// 왼손 좌표계를 기준으로 뷰 행렬을 만든다
D3DXMatrixLookAtLH(&view, &eye, &target, &up);
m_pDevice->SetTransform(D3DTS_VIEW, &view);

// 왼손 좌표계를 기준으로 투영 행렬을 만든다
D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI * 0.25f, static_cast<float>(g_iWindowWidth) / g_iWindowHeight, 1.f, 1000.f);
m_pDevice->SetTransform(D3DTS_PROJECTION, &proj);

m_pDevice->SetRenderState(D3DRS_LIGHTING, false);
m_pDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);

뷰 행렬과 투영 행렬을 구한다.

이대로 출력하면 사각형만 출력되기 때문에 입체감을 전혀 느낄수 없다.

 

 

D3DXMATRIX world;
D3DXMATRIX rx, ry, rz;
D3DXMATRIX scale;
D3DXMATRIX translation;
m_fRotX += 0.001f;
m_fRotY += 0.001f;
m_fRotZ += 0.001f;

D3DXMatrixScaling(&scale, 1.f, 1.f, 1.f);
D3DXMatrixRotationX(&rx, m_fRotX);
D3DXMatrixRotationY(&ry, m_fRotY);
D3DXMatrixRotationZ(&rz, m_fRotZ);
D3DXMatrixTranslation(&translation, 0.f, 0.f, 0.f);

world = scale * rx * ry * rz * translation;

m_pDevice->SetTransform(D3DTS_WORLD, &world);

모든 축으로 회전시키면 잘 회전되며 입체감을 느낄 수 있다.

 

 

인덱스 버퍼를 사용하지 않고도 출력이 가능하지만 인덱스 버퍼를 사용하는 것이 중복된 정점을 만들지 않기 때문에 메모리를 좀 더 절약할 수 있다.

 

정점, 인덱스 설정 -> 정점 버퍼, 인덱스 버퍼 생성 -> 복사 -> 디바이스 설정 -> 렌더 의 과정을 밟는다.

+ Recent posts