在Directx11上实施硬件实例化

时间:2019-04-19 17:54:10

标签: c++ directx-9 voxel

我是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+)多维数据集,而没有性能问题,所以我知道实例化是一种方法,但是我不知道如何在我的代码中实现它。为了显示多维数据集的多个实例,我需要对代码进行哪些更改?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

DX11中有一些步骤。但这是高级注释。

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

注意:如果需要对齐多维数据集,请为它们使用矩阵。您会在GPU端而不是CPU端获得续签罚款,这是它的使用寿命。但这是迄今为止最有效的呼叫方式。