微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

间接绘图导致未绘图

如何解决间接绘图导致未绘图

我正在尝试制作一个渲染器,该渲染器将尽可能少地使用cpu。我打算将所有绘图数据存储在GPU内存中,也许使用计算着色器对其进行更改。为此,我想使用间接绘图命令-vkCmdDrawIndexedindirectCount,但是使用它不会导致绘制任何内容。两者均未绘制vkCmdDrawIndexedindirect。使用非间接vkCmdDrawIndexed可以正常工作。验证层不报告任何内容。我甚至几乎错失了错误

间接绘制不适用于主机内存和设备内存中的缓冲区,因此暂存代码很可能是问题所在。编写命令缓冲区的代码是这样的:

*((uint32_t*)render.memmap) = 1;
((VkDrawIndexedindirectCommand*)render.memmap+4)[0].indexCount
                            = 3*2*6;
((VkDrawIndexedindirectCommand*)render.memmap+4)[0].firstIndex
                            = 0;
((VkDrawIndexedindirectCommand*)render.memmap+4)[0].vertexOffset
                            = 0;
((VkDrawIndexedindirectCommand*)render.memmap+4)[0].firstInstance
                            = 0;
((VkDrawIndexedindirectCommand*)render.memmap+4)[0].instanceCount
                            = 16*16*16;

我尝试使用的间接绘制命令是:

vkCmdDrawIndexedindirectCount(chain.cmdbuffers[i],bufferI,4,//draw commands buffer,offset of 4 for count data
    bufferI,//count buffer
    1024,//max draws
    sizeof(VkDrawIndexedindirectCommand));//stride
vkCmdDrawIndexedindirect(chain.cmdbuffers[i],//draw command buffer,offset
    1,//just one draw
    sizeof(VkDrawIndexedindirectCommand));

解决方法

感谢Sasha Willems向我推荐该工具。我的错误是在代码中,我将值输入到映射的内存中。指针算术根据对象指针指向的大小来更改指针值,因此((object*)somePointer+n)n会将指针值偏移对象大小* n,而不仅仅是n。解决方法是在render.memMap+4周围加上括号。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。