首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Direct3D11(C++):渲染(基本)问题

Direct3D11(C++):渲染(基本)问题
EN

Stack Overflow用户
提问于 2011-09-07 02:31:46
回答 1查看 2.2K关注 0票数 4

我一直在关注一本关于使用D3D11进行游戏编程的基础的书。我现在了解了Direct3D的绝对基础:)

但是..。我有个问题。在书中,我总是必须一次制作一个演示。现在,我正试着用它做一个2D游戏。因为我不想习惯坏习惯,所以我需要你的建议。

在书中,我总是必须定义一个(带有VertexPos和位置成员的结构VertexPos )或(只有一个XMFLOAT3位置成员的结构XMFLOAT3)。在我正在制作的游戏中,我希望能够绘制没有纹理的实体表面和有纹理的表面。我不知道该怎么做,更不用说高效地做了。

下面是我的渲染函数:

代码语言:javascript
运行
复制
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);
}

那么,我应该如何有效地处理多个顶点缓冲区,输入布局,着色器,混合器等?

我应该只创建这些的多个版本,然后在绘图调用后设置重置输入程序集、着色器等吗?或者这不起作用/这是不是效率低下?

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-07 07:11:48

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

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

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

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

与过去相比,现代3D硬件和API用于更改状态的开销有所减少,因此排序以最小化状态更改的重要性比以前有所降低,但对于需要在PC上获得最高性能的游戏来说,这仍然是一种常见的做法。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7324471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档