使用 Push Constant 刷新每一帧

Using Push Constant to refresh every frame

提问人:fresh bird 提问时间:11/16/2023 最后编辑:Nicol Bolasfresh bird 更新时间:11/17/2023 访问量:35

问:

代码如下:

# //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值呢?能实现吗?

或者只是我必须在渲染循环中重新生成新的命令缓冲区(具有更新的旋转值)?

我真正想知道的是,我可以在没有重建命令缓冲区的情况下更新渲染循环中的推送常量值吗

武尔坎

评论

0赞 Nicol Bolas 11/17/2023
"我发现在建立过程中,3 旋转值被固定到命令缓冲区中。你怎么知道“3旋转值”没有变化?
0赞 fresh bird 11/17/2023
因为在我最初的成就中,我首先创建了 3 个命令缓冲区,并加载了其中的所有 cmd(包括 push 常量),然后在我的渲染循环中,我只调用了这 3 个 cmdbuffer。
0赞 fresh bird 11/17/2023
在渲染结果中,三角形以非常小的角度旋转,这意味着旋转角度限制在小范围内,我调试发现推送常量值在 cmdbuffer 中是固定的。如果我想继续旋转结果,我必须在每个渲染循环中创建 cmdbuffer 并刷新其中的推送常量。

答:

1赞 Sascha Willems 11/17/2023 #1

推送常量是命令缓冲区状态的一部分。这意味着,如果生成命令缓冲区,则在创建命令缓冲区时设置的推送常量值将是固定的(对于该命令缓冲区)。因此,为了“更新”该状态,您需要使用新值重新创建命令缓冲区。

对于您的用例,使用统一缓冲区可能是更好的选择,因为无需重新创建命令缓冲区即可更新该缓冲区。

评论

0赞 fresh bird 11/18/2023
谢谢你的回答,它真的解决了我的问题。