在 Directx11 上实现硬件实例化
Implement hardware instancing on Directx11
我是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+) 多维数据集,而不会出现性能问题,所以我知道实例化是要走的路,但我不知道如何在我的代码中实现它。我需要对代码进行哪些更改才能显示多维数据集的多个实例?
提前感谢!
DX11 中有几个步骤。 但这些是高级笔记。
您将需要更新顶点着色器- 签名以包含其他实例字段,在我的头顶上,您基本上将它们设置为插槽 1 而不是 0,并以类似于创建顶点着色器顶点定义的方式对齐字节。 这里需要特别注意的是,如果你输入一个矩阵,你知道它的列还是行是主要的。
- 更新顶点着色器以反映您在签名中定义的其他实例字段。
- 将实例缓冲区设置为插槽 1 或您为实例定义的任何 n 值。 您设置的槽必须与您的定义匹配,这一点很重要。
- 从外观上看,您将需要调用DrawIndexInstanced,并传入实例计数。
注意:如果需要对齐多维数据集,请使用矩阵。 您将招致平局惩罚,不是在 CPU 端,而是在 GPU 上,这是它的正当生活。 但这是迄今为止最有效的通话方式。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 在 Directx11 上实现硬件实例化