Tutorial2_정점 버퍼를 이용한 Polygon(폴리곤) 그리기



//-----------------------------------------------------------------------------

// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------

VOID Render()
{

    // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET,

                                  D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {

        // 정점 버퍼의 삼각형을 그린다.
        // 1. 정점 정보가 담겨 있는 정점 버퍼를 출력 스트림으로 할당한다.

        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
 

        // 2. D3D에게 정점 셰이더 정보를 지정한다. 대부분의 경우 FVF만 지정한다.
        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );

        // 기하 정보를 출력하기 위한 DrawPrimitive()함수 호출
        g_pd3dDevice->DrawPri

mitive( D3DPT_TRIANGLELIST, 0, 1 );
 

        // End the scene
        // 렌더링 종료

        g_pd3dDevice->EndScene();
    }
 

    // Present the backbuffer contents to the display
    // 후면 버퍼를 전면 퍼버로 출력

    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

 

아래의 화면그리기에서는 못보던 3가지가 있다. BeginScene()과 EndScene()사이를 잘 보라. 

1. SetStreamSource() 함수로 출력할 정점 버퍼를 디바이스에 바인딩(결합)한다.

2. SetFVF()함수로 정점 포맷을 FVF로 디바이스에 지정한다.

3. DrawPrimitive()함수로 정점 버퍼의 폴리곤을 그린다.


 

1. SetStreamSource()

정점 버퍼를 장치의 데이터 스트림에 바인드 한다.

 

구문

HRESULT SetStreamSource(      
UINT StreamNumber,
 IDirect3DVertexBuffer9 *pStreamData,
 UINT OffsetInBytes,
 UINT Stride );

파라미터

StreamNumber
0 로부터 스트림의 최대수 -1 까지의 범위의 데이터 스트림을 지정한다.
pStreamData
IDirect3DVertexBuffer9 인터페이스의 포인터. 지정한 데이터 스트림에 바인드 하는 정점 버퍼를 나타낸다.
OffsetInBytes
스트림 선두로부터 정점 데이터 선두까지의 오프셋(offset) (바이트 단위). 장치가 스트림 오프셋(offset)를 지원 할지 어떨지 조사하려면, D3DDEVCAPS2D3DDEVCAPS2_STREAMOFFSET정수를 확인한다.
Stride
성분의 크기(바이트 단위).

반환값

성공했을 경우는,D3D_OK를 돌려준다.

실패했을 경우는,D3DERR_INVALIDCALL을 돌려준다.



2. SetFVF()

현재의 정점 스트림 선언을 설정한다.

 

구문

HRESULT SetFVF(      

    DWORD FVF );

파라미터

FVF
고정 기능 정점 타입을 저장 하고 있는 DWARD.

반환값

성공했을 경우는, D3D_OK를 돌려준다.

실패했을 경우는 D3DERR_INVALIDCALL을 돌려준다.




3. DrawPrimitive()
현재의 데이터 입력 스트림 세트로부터, 지정된 타입의 비인덱스 첨부 지오메트리 기본도형의 순서를 렌더링 한다.

 

구문

HRESULT DrawPrimitive(      

    D3DPRIMITIVETYPE PrimitiveType,
 UINT StartVertex,
 UINT PrimitiveCount );

파라미터

PrimitiveType
D3DPRIMITIVETYPE열거형의 멤버. 렌더링하는 기본도형의 종류를 기술한다.
StartVertex
로드하는 최초의 정점의 인덱스. StartVertex 를 선두에, 올바른 정점수가 정점 버퍼로부터 읽어내진다.
PrimitiveCount
렌더링 하는 기본도형의 수. 기본도형의 허용 최대수는, D3DCAPS9 구조체의MaxPrimitiveCount 멤버를 체크해 결정된다. PrimitiveCount 는, 기본도형 타입으로 지정된 기본도형의 수이다. 라인 리스트의 경우, 각 기본도형는 2 개의 정점을 갖는다. 삼각형 리스트의 경우, 각 기본도형는 3 개의 정점을 갖는다.

반환값

성공했을 경우는 D3D_OK 를 돌려준다.

실패했을 경우는 D3DERR_INVALIDCALL을 돌려준다.

(메서드의 호출이 무효. 메서드의 파라미터에 무효인 값이 설정되어 있는 경우 등)

주의

한 번에 1 개의 삼각형을 지정해 IDirect3DDevice9::DrawPrimitive 을 호출해서는 안된다. 종래의, 고정 기능을 가지는 애플리케이션을 Microsoft® DirectX® 9.0 으로 처리할 때는, Draw 호출을 실시하기 전에 IDirect3DDevice9::SetFVF 에의 호출을 추가할 필요가 있다.




이 글을 공유하기

댓글

Designed by JB FACTORY