在 DirectX12 中,您可以使用相当于世界变换的单个统一缓冲区来渲染不同位置的多个对象,例如:
// Basic simplified pseudocode
SetRootSignature();
SetPrimitiveTopology();
SetPipelineState();
SetDepthStencilTarget();
SetViewportAndScissor();
for (auto object : objects)
{
SetIndexBuffer();
SetVertexBuffer();
struct VSConstants
{
QEDx12::Math::Matrix4 modelToProjection;
} vsConstants;
vsConstants.modelToProjection = ViewProjMat * object->GetWorldProj();
SetDynamicConstantBufferView(0, sizeof(vsConstants), &vsConstants);
DrawIndexed();
}
但是,在 Vulkan 中,如果您对单个统一缓冲区执行类似操作,则所有对象都将呈现在最后一个世界矩阵的位置:
for (auto object : objects)
{
SetIndexBuffer();
SetVertexBuffer();
UploadUniformBuffer(object->GetWorldProj());
DrawIndexed();
}
有没有办法在 Vulkan 中使用单个统一缓冲区绘制多个对象,就像在 DirectX12 中一样?
我知道 Sascha Willem 的动态统一缓冲区示例 ( https://github.com/SaschaWillems/Vulkan/tree/master/dynamicuniformbuffer ),他在一个大的统一缓冲区中打包了许多矩阵,虽然有用,但并不完全是我的我正在寻找。
提前感谢您的帮助。