首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Directx11上实现硬件实例化

在Directx11上实现硬件实例化
EN

Stack Overflow用户
提问于 2019-04-20 01:54:10
回答 1查看 269关注 0票数 0

我完全是Directx/3D编程的初学者。我需要在Directx 11上实现硬件实例化的帮助。我正在尝试在屏幕上渲染多个立方体,以创建某种类似于“我的世界”的体素引擎。问题是,我不知道从哪里开始实现这个目标。这是我的"render frame“函数的样子:

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

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2019-07-31 05:50:07

DX11中有几个步骤。但这些是高级音符。

  1. 你需要更新你的顶点着色器签名,以包括额外的实例字段,在我的头上,你基本上将它们设置为插槽1而不是0,并以类似于创建顶点着色器顶点定义的方式对齐字节。
  2. 更新顶点着色器以反映您在签名中定义的附加实例场。
  3. 将实例缓冲区设置为插槽1或您为实例定义的任何n值。您设置的插槽必须与definition.
  4. From的外观相匹配,这一点很重要,您需要调用DrawIndexInstanced,同时传入实例计数。

注意:如果您的立方体需要对齐,请使用矩阵。你将招致抽签惩罚,不是在CPU方面,而是在GPU上,它的正常寿命。但这是目前为止最有效的调用方式。

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

https://stackoverflow.com/questions/55765822

复制
相关文章

相似问题

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