我完全是Directx/3D编程的初学者。我需要在Directx 11上实现硬件实例化的帮助。我正在尝试在屏幕上渲染多个立方体,以创建某种类似于“我的世界”的体素引擎。问题是,我不知道从哪里开始实现这个目标。这是我的"render frame“函数的样子:
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+)立方体,没有性能问题,所以我知道实例化是可行的,但我不知道如何在我的代码中实现它。为了显示多维数据集的多个实例,我需要对代码进行哪些更改?
提前感谢!
发布于 2019-07-31 05:50:07
DX11中有几个步骤。但这些是高级音符。
注意:如果您的立方体需要对齐,请使用矩阵。你将招致抽签惩罚,不是在CPU方面,而是在GPU上,它的正常寿命。但这是目前为止最有效的调用方式。
https://stackoverflow.com/questions/55765822
复制相似问题