그리기 (Render)

2022. 8. 14. 22:56Public/GraphicsAPI

VOID Render()
{
    /// 후면버퍼를 파란색(0,0,255)으로 지운다.
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

    /// 렌더링 시작
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        /// 정점버퍼의 삼각형을 그린다.
        /// 1. 정점정보가 담겨있는 정점버퍼를 출력 스트림으로 할당한다.
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
        /// 2. D3D에게 정점쉐이더 정보를 지정한다. 대부분의 경우에는 FVF만 지정한다.
        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
        /// 3. 기하 정보를 출력하기 위한 DrawPrimitive()함수 호출
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

        /// 렌더링 종료
        g_pd3dDevice->EndScene();
    }

    /// 후면버퍼를 보이는 화면으로!
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

BeginScene()과 EndScene() 사이에 추가된 것이 3개 있다.

  1. SetStreamSource()로 출력할 정점 버퍼를 디바이스에 바인딩(결합)한다.
  2. SetFVF()로 정점 포맷을 디바이스에 지정한다.
  3. DrawPrimitive()로 정점 버퍼의 폴리곤을 그린다.

SetStreamSource(), SetFVF(), DrawPrimitive()등의 함수에 대한 자세한 설명은 DirectX 9.0 SDK 도움말을 참고하기 바란다. 특히 DrawPrimitive()가 삼각형을 그려주는 함수인데, 첫 번째 전달인자에 따라서 다양한 동작을 한다. 예를 들어 D3DPT_LINESTRIP으로 바꾸면 폴리곤의 내부가 텅 빈 삼각형을 그릴 것이다.

 

DrawPrimitive() 함수는 다양한 변종이 있는데, DrawIndexedPrimitive(),DrawPrimitiveUP(),DrawIndexedPrimitiveUP() 등이 있다. 이중에서 실제 게임개발에 가장 많이 사용되는 함수는 DrawIndexedPrimitive()와 DrawIndexedPrimitiveUP()함 수로 인덱스를 가진 함수들이다. (이 중에서 DrawIndexedPrimitive()의 속도가 가장 빠름)

이제 컴파일해서 화면을 잘 살펴보자. 녹색과 적색이 적절히 배분된 삼각형이 나올 것이다. 이는 각각의 정점에 다른 색을 주었기 때문인데, D3D가 폴리곤 내부를 칠할 때 3개 정점의 색을 보간(interpolation)하여 적절한 색으로 칠해준 것이다. 소스에서 색을 적당히 변경하여 다시 실행해 보는 것도 재밌을 것이다.

 

'Public > GraphicsAPI' 카테고리의 다른 글

광원  (0) 2022.08.15
행렬 01  (0) 2022.08.15
정점 버퍼  (0) 2022.08.14
FVF  (0) 2022.08.14
일반적인 WIN32 구조와 D3D 비교  (0) 2022.08.10