我正在尝试在我的C ++代码中创建一个VkBool32:
VkBool32 myBool = VK_FALSE;
并通过推送常量将其推送到GLSL:
vkCmdPushConstants(..., sizeof(myBool), &myBool);
由统一存储类中的bool接收:
layout(push_constant) uniform PushConstants
{
bool myBool;
} pushConts;
首次测试似乎有效且具有预期的行为。但这是否允许使用Vulkan Spec?
答案 0 :(得分:3)
使用bool推送常量很好。规范中没有任何内容禁止这一点,我也在一些例子中使用它。
如果您看一下人类可读的SPIR-V输出,您会看到它们被转换为32位整数,因此与32位对齐:
GLSL
layout (push_constant) uniform PushConsts {
bool calculateNormals;
} pushConsts;
SPIR-V
430(PushConsts): TypeStruct 40(int)
431: TypePointer PushConstant 430(PushConsts)
432(pushConsts): 431(ptr) Variable PushConstant
433: TypePointer PushConstant 40(int)
所以,如果你是会传递包含多个布尔值的结构,你必须在CPU侧正确对齐(填充),然后才能作为推送常量传递。
至于SPIR-V方面,official spec始终是一个很好的起点,并且还包含有关如何处理推式常量以及它们如何不同的详细信息。