2011-09-06 4 views
4

나는 D3D11로 게임 프로그래밍의 기초에 관한 책을 읽었습니다. 이제 Direct3D의 기본적인 기본 내용을 이해합니다.Direct3D11 (C++) : 렌더링 (기본) 질문

하지만 ... 질문이 있습니다. 이 책에서 나는 항상 한 번에 하나의 데모를 만들어야했습니다. 이제 2D 게임을 만들려고합니다. 나쁜 습관에 익숙해지기를 원치 않으므로 조언이 필요합니다.

이 책에서는 항상 (구조체와 위치 멤버가있는 VertexPos 구조체) OR (XMFLOAT3 위치 멤버 만 사용하여 VertexPos 구조체)을 정의해야했습니다. 내가 만들고있는 게임에서 텍스처가없는 솔리드 서페이스와 텍스처가있는 서페이스를 모두 그릴 수 있기를 원합니다. 나는 이것을 효율적으로 수행하는 방법을 알지 못한다.

그래서
void GameSpriteDemo::Render() 
{ 
    if (m_pD3DContext == 0) 
    {return;} 

    float ClearColor[4] = {0.0f, 0.0f, 0.25f, 1.0f}; 
    m_pD3DContext->ClearRenderTargetView(m_pBackBufferTarget,ClearColor); 

    UINT stride = sizeof(VertexPos); 
    UINT offset = 0; 

    m_pD3DContext->IASetInputLayout(m_pInputLayout); 
    m_pD3DContext->IASetVertexBuffers(0,1,&m_pVertexBuffer, &stride, &offset); 
    m_pD3DContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 

    m_pD3DContext->VSSetShader(m_pSolidColorVS,0,0); 
    m_pD3DContext->PSSetShader(m_pSolidColorPS,0,0); 
    m_pD3DContext->PSSetShaderResources(0,1,&m_pColorMap); 
    m_pD3DContext->PSSetSamplers(0,1,&m_pColorMapSampler); 

    for(int i=0; i < 2; ++i) 
    { 
     XMMATRIX world = m_Sprites[i].GetWorldMatrix(); 
     XMMATRIX mvp = XMMatrixMultiply(world, m_VpMatrix); 
     mvp = XMMatrixTranspose(mvp); 

     m_pD3DContext->UpdateSubresource(m_pMvpCB,0,0,&mvp,0,0); 
     m_pD3DContext->VSSetConstantBuffers(0,1,&m_pMvpCB); 

     m_pD3DContext->Draw(6,0); 
    } 

    m_pSwapChain->Present(0,0); 
} 

, 어떻게 등 여러 버텍스 버퍼, 입력 레이아웃, 쉐이더, 믹서기, 효율적으로 이것을 처리한다 : 여기

내 렌더링 기능입니까?

그 중 여러 버전을 만든 다음 그리기 호출 후에 입력 어셈블리, 셰이더 등을 재설정해야합니까? 아니면 이것이 효과가 없습니까/이것이 효율적이지 않습니까?

감사합니다 :)

+0

프레임 워크 사용은 어떻게됩니까? – Dani

+0

처음부터 이렇게하는 법을 배우고 싶습니다 ... 제게 많은 것을 가르쳐 줄 것입니다. – xcrypt

답변

4

간단한 대답은 등 여러 버텍스 버퍼, 입력 레이아웃, 쉐이더를 생성하고 각각의 해당 그리기 호출하기 전에 적절한 사람을 설정해야 yes입니다. 이것은 효과적이고 (현대 하드웨어의 2D 게임에 충분히 효율적이어야합니다) 효율적입니다.

전체 3D 게임 엔진에서 상황이 좀 더 복잡해집니다. 일반적으로 렌더링 엔진에는 버텍스 및 인덱스 버퍼, 입력 레이아웃, 셰이더 등과 같은 기본 객체 위에 몇 가지 추가 내부 수준의 추상화가 있습니다.

합리적인 공통적 인 방식으로 간단한 방법으로 구조화하는 것은 Mesh 클래스를 사용하는 것입니다. 인덱스 버퍼, 입력 레이아웃, 셰이더, 텍스처 등 모든 단일 버텍스 버퍼, 인덱스 버퍼, 단일 드로 콜에서 그릴 수있는 3D 모델을 구성하는 모든 버텍스 버퍼, 블렌드 모드, 컬링 모드 등과 같은 렌더링 상태의 표시) 및 해당 드로 콜 호출

장치 상태를 변경하는 데 드는 비용이 있습니다. 따라서 렌더링 엔진은 특정 프레임에서 그리기가 필요한 모든 개체를 시도하고 정렬하여 필요한 상태 변경 횟수를 최소화하도록 설계됩니다. 예를 들어, Dawn of War 2 렌더러에서는 모든 메쉬 지오메트리를 정렬하여 예를 들어 그릴 수있었습니다. 텍스쳐 등이있는 우주 해양 체를 모두 그리기 전에 필요한 최소한의 상태 변화가있는 모든 우주선 헬멧.

최신 3D 하드웨어 및 API는 상태를 변경하는 데 소요되는 오버 헤드가 과거보다 작습니다 상태 변경을 최소화하기 위해 정렬하는 것은 한때보다 덜 중요하지만 PC에서 최대 성능을 필요로하는 게임의 경우 여전히 일반적인 방법입니다.

스키닝 된 애니메이션, 지형, 입자 시스템, 전체 화면 효과, 2D UI 등과 함께 유연한 조명 및 재료 모델을 지원하는 데이터 기반 렌더링 엔진에서 모든 요소를 ​​그리는 데 필요한 상태를 관리하기위한 적합한 디자인 게임 객체와 정렬을 위해 최대 효율로 그릴 수 있으므로 상당히 복잡해질 수 있으며 여러 가지 구조화 방법이 있습니다. '렌더러 상태 관리'로 분류 될 수있는 모든 코드는 일반적인 렌더링 엔진에서 코드의 상당 부분을 차지합니다.