2011-09-06 108 views
4

我一直在关注一本关于使用D3D11进行游戏编程的基础知识的书。我现在了解Direct3D的绝对基础知识:)Direct3D11(C++):渲染(基本)问题

但是...我有一个问题。在书中,我总是不得不一次做一个演示。现在,我正在试图制作一款2D游戏。由于我不想习惯坏习惯,所以我需要你的建议。在书中,我总是必须定义一个(带有texcoord和位置成员的结构VertexPos)或(仅带有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

简单的答案是肯定的,你应该创建多个顶点缓冲区,输入的布局,着色器等,每个相应的绘图调用之前设置适当的。这将工作并且相当高效(对于现代硬件上的2D游戏应该足够高效)。

在完整的3D游戏引擎中,事情往往会变得复杂一些。通常,渲染引擎会在顶点和索引缓冲区,输入布局,着色器等基本对象之上分层添加一些内部抽象层。

构造事物的一个相当常见的简单方法是拥有一个Mesh类,它知道关于所有顶点缓冲区,索引缓冲区,输入布局,着色器,纹理等,它们组成了一个3D模型的一部分,可以在一次绘制调用中绘制,并负责将它们全部设置(通常与其他位一起渲染状态如混合模式,剔除模式等)并发出相应的绘制调用。

没有与改变任何设备状态等渲染引擎通常是为了尝试和排序都需要在特定帧绘制,以尽量减少所需的状态变化数量的对象相关的成本。例如,在“战争黎明2”渲染器中,我们对所有网格几何进行了排序,以便我们可以绘制例如在绘制具有不同顶点和索引缓冲区,纹理等的所有空间海洋体之前,需要具有最小状态改变的所有空间海洋头盔。

现代3D硬件和API比过去改变状态的开销少一些所以排序以最大限度地减少状态变化的重要性不如以前那么重要,但对于需要在PC上获得最大性能的游戏,这仍然是常见做法。

在数据驱动的渲染引擎中,支持灵活的照明和材质模型以及蒙皮动画,地形,粒子系统,全屏幕效果,2D UI等等,这是一个合适的设计,用于管理绘制所需的所有状态游戏对象并对其进行排序以便能够以最大效率进行绘制可能会变得相当复杂,并且有许多不同的方法来构造事物。所有可归类为“渲染器状态管理”的代码通常构成典型渲染引擎中的大部分代码。