【问题标题】:vulkan: how to use one vertex buffer with different offsets?vulkan:如何使用一个具有不同偏移量的顶点缓冲区?
【发布时间】:2016-12-11 10:43:20
【问题描述】:

我在程序的“load vulkan”阶段创建了一个顶点缓冲区。无论什么模型实例可能使用它们,都应该成为所有顶点的缓冲区。我的应用程序应该能够在运行时随时加载顶点,为顶点缓冲区(当然还有索引缓冲区)使用不同的偏移量。

用于测试顶点缓冲区的静态大小为 8 个顶点,索引缓冲区的静态大小为 12 个索引。

我现在正在尝试加载第一个模型实例(4 个顶点,6 个索引),它可以工作。我可以在屏幕上看到结果。 (这是一个正方形) 然后我尝试加载另一个模型实例(同样是 4 个顶点,6 个索引)(另一个正方形)。

问题:第二个模型实例不会显示在屏幕上。我检查了顶点缓冲区和索引缓冲区的偏移量。他们似乎是对的。我知道第二个实例还没有纹理图像,但是至少应该有一个白色方块,因为着色器中的默认混合颜色是白色。屏幕的默认清除颜色为黑色。为了进行测试,我还将其更改为白色,假设 uv 颜色可能是 0、0、0。

那么为什么屏幕上看不到第二个实例? 我读了一些文章,有些建议在更新顶点缓冲区后“执行命令缓冲区”。除了理解这意味着什么之外,这真的没有意义,因为这两个实例都是在运行时创建的,而第一个有效!

请问有什么帮助吗?

你可以在这里找到源代码:

project: main function

游戏设计,加载模型实例:gm_update.cpp

引擎的东西,vulkan:de_core.cpp

顶点着色器:shaders/stage.vert

片段着色器:shaders/stage.frag

您可以在该文件夹中找到所有源文件。只需更改文件名。 我想发布代码示例。但我真的不知道错误在 de_core.cpp 中的确切位置

【问题讨论】:

  • 请不要将您的代码作为链接发布,而是在您的问题中使用minimal reproducible example 来重现您的问题。
  • 是的,你做了太多的假设。使用最少示例的另一个好处是您可以轻松地尝试类似的新功能。 ;;但我在你的代码中看到VkDeviceSize offsets[] = {0};vkCmdBindVertexBuffers() 之前,vkCmdBindIndexBuffer()::offset = 0,所以看起来你根本没有使用偏移量。

标签: c++ buffer offset vertex vulkan


【解决方案1】:

指向您的源代码的链接对我不起作用,但我有一个建议。绑定缓冲区时,请确保每次绘制调用只调用一次 vkBindVertexBuffers。它替换了当前绑定的缓冲区。如果您需要绑定多个缓冲区,请执行以下操作

vkBuffer buffers[2] = {buffer1, buffer2};
vkDeviceSize offsets[2] = {0, 0};//offsets of buffers
vkbindVertexBuffers(commandBuffer, firstInputBindingToUpdate(probably 0), 2, buffers, offsets);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多