【问题标题】:Implement hardware instancing on Directx11在 Directx11 上实现硬件实例化
【发布时间】:2019-04-19 17:54:10
【问题描述】:

我是 Directx/3D 编程的初学者。我需要在 Directx 11 上实现硬件实例化的帮助。我正在尝试在屏幕上渲染多个立方体,以创建某种 Minecraft 式体素引擎。问题是,我不知道从哪里开始实现这一目标。这就是我的“渲染框架”功能的样子:

void RenderFrame(void)
{
    D3DXMATRIX matView, matProjection;
    D3DXMATRIX matFinal;

    // create a view matrix
    D3DXMatrixLookAtLH(&matView,
        &D3DXVECTOR3(0.0f, 9.0f, 24.0f),   // the camera position
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),    // the look-at position
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f));   // the up direction

// create a projection matrix
    D3DXMatrixPerspectiveFovLH(&matProjection,
        (FLOAT)D3DXToRadian(45),                    // field of view
        (FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, // aspect ratio
        1.0f,                                       // near view-plane
        100.0f);                                    // far view-plane

// create the final transform
    matFinal = matView * matProjection;

    // clear the back buffer to a deep blue
    devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f));

    // clear the depth buffer
    devcon->ClearDepthStencilView(zbuffer, D3D11_CLEAR_DEPTH, 1.0f, 0);

    // select which vertex buffer to display
    UINT stride = sizeof(VERTEX);
    UINT offset = 0;
    devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);
    devcon->IASetIndexBuffer(pIBuffer, DXGI_FORMAT_R32_UINT, 0);

    // select which primtive type we are using
    devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    // draw the Hypercraft
    devcon->UpdateSubresource(pCBuffer, 0, 0, &matFinal, 0, 0);
    devcon->DrawIndexed(24, 0, 0);

    // switch the back buffer and the front buffer
    swapchain->Present(0, 0);
}

请注意,有一个顶点缓冲区包含立方体的顶点,而索引缓冲区包含它的索引。我想在一次绘制调用中一次在屏幕上渲染许多(5000+)立方体,没有性能问题,所以我知道实例化是要走的路,但我不知道如何在我的代码中实现它。为了显示多维数据集的多个实例,我需要对代码进行哪些更改?

提前致谢!

【问题讨论】:

    标签: c++ directx-9 voxel


    【解决方案1】:

    DX11 有几个步骤。但这些是高级注释。

    1. 您需要更新您的顶点着色器签名以包含额外的实例字段,在我的脑海中,您基本上将它们设置为插槽 1 而不是 0,并以类似于创建顶点着色器顶点的方式对齐字节定义。这里需要额外注意的是,如果你输入一个矩阵,你知道它的列或行是主要的。
    2. 更新您的顶点着色器以反映您在签名中定义的其他实例字段。
    3. 将您的实例缓冲区设置为插槽 1 或您为实例定义的任何 n 值。您设置的插槽必须与您的定义相匹配,这一点很重要。
    4. 从外观上看,您需要调用 DrawIndexInstanced,同时传入实例数。

    注意:如果您的立方体需要对齐,请使用矩阵。您将不会在 CPU 端而是在 GPU 上受到平局惩罚,这就是生命。但这是迄今为止最有效的调用方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 2016-07-13
      相关资源
      最近更新 更多