Graphics 获取给定设备上统一缓冲区的偏移对齐

Graphics 获取给定设备上统一缓冲区的偏移对齐,graphics,shader,vulkan,Graphics,Shader,Vulkan,在给定的VkDevice上,是否有任何方法可以在使用VK\u buffer\u usage\u UNIFORM\u buffer\u BIT的缓冲区所需的分配中接收偏移量的对齐(以字节为单位) 如果我已经得到了这样一个VkBuffer,那么可以从调用vkGetBufferMemoryRequirements收到的VkMemoryRequirements结构的size字段中检索该值 但是,如果我想用给定的缓冲区获得该值,我是否需要创建一个大小为1的“虚拟”缓冲区(当启用验证层时,指定大小0会产生验

在给定的
VkDevice
上,是否有任何方法可以在使用
VK\u buffer\u usage\u UNIFORM\u buffer\u BIT
的缓冲区所需的分配中接收偏移量的对齐(以字节为单位)

如果我已经得到了这样一个
VkBuffer
,那么可以从调用
vkGetBufferMemoryRequirements
收到的
VkMemoryRequirements
结构的
size
字段中检索该值


但是,如果我想用给定的缓冲区获得该值,我是否需要创建一个大小为
1
的“虚拟”缓冲区(当启用验证层时,指定大小
0
会产生验证错误)?

UBO的校准要求是一个设备限制:
VKP物理设备限制::MinuniforMbufferofSetAlignment
。原因是,它不仅适用于将缓冲区绑定到内存分配时使用的偏移量要求,还适用于将该缓冲区用作UBO描述符时缓冲区内使用的UBO数据开始处的任何偏移量。

如果我没有理解您的问题,您正在寻找
memoryOffset
参数到
vkBindBufferMemory
的对齐方式,该对齐方式对于以后创建的任何
VK\u BUFFER\u用法\u UNIFORM\u BUFFER\u位都有效。实际上,对于任何这样的缓冲区,您都需要在
VkMemoryRequirements::alignment
中得到最坏/最严格的对齐方式。对吗

我认为您不能直接查询这种最坏情况下的对齐方式
VkPhysicalDeviceLimits::MinuniforMbufferofSetAlignment
已接近,但是缓冲区到内存对齐要求的下限,而不是上限([]):

alignment
成员满足与
VkBuffer
使用相关的缓冲区描述符偏移对齐要求:

  • 如果包含
    VK\u BUFFER\u usage\u UNIFORM\u BUFFER\u BIT
    alignment
    必须是
    VkPhysicalDeviceLimits::MinuniforMbufferfSetalignment
    的整数倍
(这意味着
VkBuffer
中任何
minuniformbufferfetaalignment
对齐的块都可以用于统一的缓冲区描述符。但是
VkBuffer
的基偏移量可能需要比其内描述符的偏移量更严格地对齐)

但是,如果确实创建了代理
VkBuffer
并查询其对齐方式,则可以保证具有相同用法和标志的其他
VkBuffer
的对齐方式将具有相同的对齐要求:

  • alignment
    成员对于所有
    VkBuffer
    对象都是相同的,这些对象是使用传递给
    vkCreateBuffer
    VkBufferCreateInfo
    结构中的
    用法
    标志
    成员的相同值组合创建的

由于缓冲区大小不会影响对齐,因此可以使用您建议的小型代理缓冲区。

您是指
VkMemoryRequirements::alignment
而不是
VkMemoryRequirements::size
?另外,在最后一段中,您的意思是“在没有给定缓冲区的情况下获取此值”?