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
?另外,在最后一段中,您的意思是“在没有给定缓冲区的情况下获取此值”?