我创建了我的游戏框架基于福尔康渲染器后端。目前我加载在一个网格约10,000独特的三角形(没有索引 - 所有个体),其中每个顶点有一个位置值,RGB值,没有法线和没有质感COORDS。这适用出作为每个三角形72个字节,即。 1 * XYZ浮+ 1 * RGB漂浮每个顶点= 6间浮动。 6个* 3个顶点=每个三角形18间浮动。每个三角形18×4 = 72个字节。的顶点数据被存储在与VK_BUFFER_USAGE_VERTEX_BUFFER_BIT标志设置一个GPU本地缓冲器。
我还使用同样的VERT和片段着色器针对具有CPU的计算MVP矩阵推常量的那一刻所有的网格。
如果我使用72的倍数作为在vkCmdBindVertexBuffers()偏移PARAM,然后我网在瓦解,在缓冲区中的第一个三角形从未绘制。我已经递增由72逐帧其溶于无段错误或错误网格的偏移。 LunarG标准验证与没有报告验证错误启用,(我在我的代码有很多错误检查和日志记录)。
顺便说一句,如果我不使用的72倍数,然后我得到了一些非常有趣的渲染,但没有崩溃!我也renderdoc运行一个六岁的机器上获得650fps的帧速率。
这是结合了顶点缓冲的代码...
vkCmdBindVertexBuffers, (cmd[swapindex], 0, 1, vertexBuffers, offsets)
现在,只是因为它运行在我的电脑罚款并不意味着它是正确的。有一两件事,我感到困惑的是关于内存对齐要求福尔康规范的领域,特别是在VkPhysicalDeviceLimits。
有几个在VkPhysicalDeviceLimits:minTexelBufferOffsetAlignment,minUniformBufferOffsetAlignment&minStorageBufferOffsetAlignment。
细则中指出:对准构件满足与VkBuffer的使用相关的缓冲区描述符偏移对齐要求:
如果使用包含VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT或VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,对准必须是VkPhysicalDeviceLimits的整数倍:: minTexelBufferOffsetAlignment。
如果使用包括VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,对准必须VkPhysicalDeviceLimits的整数倍:: minUniformBufferOffsetAlignment。
如果使用包括VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,对准必须VkPhysicalDeviceLimits的整数倍:: minStorageBufferOffsetAlignment。
我创建使用bufferCreateInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT(和VK_BUFFER_USAGE_TRANSFER_DST_BIT,VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)在装置本地存储器中的顶点缓冲器与vkCreateBuffer()。
现在的问题......因为我没有创造与VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT或VK_BUFFER_USAGE_STORAGE_BUFFER_BIT一个缓冲,这是否意味着没有对偏移参数的内存对齐要求当我打电话vkCmdBindVertexBuffers(CMD,0,1,vertexBuffer,偏移)?
我问的原因是我想要存储多个网格与VK_BUFFER_USAGE_VERTEX_BUFFER_BIT标志设置单一vkCreateBuffer()分配的缓冲区。那么我可以抵消到每一个独特的网格我要画这个“超级顶点缓冲”,而无需多个顶点缓冲区分配。我知道分配顶点缓存的限制,通常为4096(VkPhysicalDeviceLimits :: maxMemoryAllocationCount),但不是分配多个顶点缓冲区我宁愿使用一个“超级缓存”的性能。
这是否有意义?
更新:我已经改变了我的代码使用没有在vkCmdBindVertexBuffers()偏移,而是在vkCmdDraw使用firstVertex参数()为网格模型抵消由此产生了略微更高,更稳定的FPS。
我没有看到在规范的任何对齐要求,但我认为这可能是一个疏忽。您可以尝试四舍五入到16的倍数;任何实际的对齐要求是不太可能比大。所以,如果你的第一个网格是5个三角形,你需要为它5个* 72字节,第二网将在偏移ROUND_UP(5 * 72,16)= 368开始。如果不工作,你可能有一个错误在其他地方。
而不是使用偏移vkCmdBindVertexBuffers
,不过,你可以只绑定充分顶点缓冲一次,并使用firstVertex
参数每个画来表示索引缓存网格的开始。