提问人:fresh bird 提问时间:11/16/2023 最后编辑:Nicol Bolasfresh bird 更新时间:11/17/2023 访问量:35
使用 Push Constant 刷新每一帧
Using Push Constant to refresh every frame
问:
代码如下:
# //begin info
# //begin render pass
mypipeline->bind(commandbuffer);
for (auto& obj : gameObjects) {
obj.transform2d.rotation = glm::mod(obj.transform2d.rotation + 0.05f, glm::two_pi<float>());
simplepushconstantdata push{};
push.offset = obj.transform2d.translation;
push.color = obj.color;
push.transform = obj.transform2d.mat2();
vkCmdPushConstants(commandbuffer, mypipelinelayout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(simplepushconstantdata), &push);
obj.model->bind(commandbuffer);
obj.model->draw(commandbuffer);
}
# //end render pass
# //end info
在我的成就中,我建立了 3 个命令缓冲区,我发现在建立过程中,3 个旋转值被固定到命令缓冲区中。
那么如何更改命令缓冲区中的PushConstant值呢?能实现吗?
或者只是我必须在渲染循环中重新生成新的命令缓冲区(具有更新的旋转值)?
我真正想知道的是,我可以在没有重建命令缓冲区的情况下更新渲染循环中的推送常量值吗
答:
1赞
Sascha Willems
11/17/2023
#1
推送常量是命令缓冲区状态的一部分。这意味着,如果生成命令缓冲区,则在创建命令缓冲区时设置的推送常量值将是固定的(对于该命令缓冲区)。因此,为了“更新”该状态,您需要使用新值重新创建命令缓冲区。
对于您的用例,使用统一缓冲区可能是更好的选择,因为无需重新创建命令缓冲区即可更新该缓冲区。
评论
0赞
fresh bird
11/18/2023
谢谢你的回答,它真的解决了我的问题。
评论