如何解决间接绘图导致未绘图
我正在尝试制作一个渲染器,该渲染器将尽可能少地使用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 举报,一经查实,本站将立刻删除。