DX11 恒定缓冲区持久性

Posted

技术标签:

【中文标题】DX11 恒定缓冲区持久性【英文标题】:DX11 Constant buffer persistence 【发布时间】:2018-01-28 20:42:48 【问题描述】:

使用 DirectX 11 和 Effect 11,我试图了解如何使用不同的着色器有效地绘制两个对象。所以首先我设置了所有状态并设置了常量缓冲区一次。在遍历所有第一个对象的网格时,所有先前设置的常量缓冲区都保持可用,这很好,如您所见 here.

然后我正在应用另一个通道(来自 Effect 11 的 Pass.Apply())来绘制第二个对象。在这一点上,我所有的常量缓冲区都是 destroyed as shown there.

所以现在我开始怀疑是否不能在应用启动时一次性设置常量缓冲区,然后在任何着色器中随时使用/共享。还是只属于活动着色器?

谢谢!

【问题讨论】:

是什么让您认为 CB 正在被“摧毁”?正如人们所期望的那样,每次抽签都会更新它们。看看这个classic presentation 以获得对常量缓冲区的一些深入了解。 即使是关于以前版本的 DirectX,它也是一个非常有趣的文档,感谢 Chuck 的分享,但我没有看到任何关于 CB“生命周期”的信息可以解释我的情况。 【参考方案1】:

如果我记得,如果您执行不同的效果,那么您将不得不将常量缓冲区重新关联到舞台(这也可能取决于驱动程序)。只有在不更改着色器状态的情况下才能重用相同的常量缓冲区。

为了安全起见,不同的 Pass 基本上是绑定一组新的着色器(如果它们不同的话)。最佳做法是绑定资源(缓冲区),每次执行不同的效果传递。

我个人已经远离了已弃用的 Effects,我还发现明确了解我绑定到管道的内容有助于我理解常量缓冲区的使用。

缓冲区不应该被破坏,它应该在第二次调用时解除绑定 - 否则你会有更邪恶的事情发生。

【讨论】:

哦,非常有趣的一点,我很想对此进行确认,这可以准确解释我遇到这种“情况”的原因。非常感谢您反馈 ErnieDingo。

以上是关于DX11 恒定缓冲区持久性的主要内容,如果未能解决你的问题,请参考以下文章

iOS,音频队列:缓冲区大小不是恒定的

谷歌协议缓冲区是不是支持序列化前的大小计算?

将 FBX 顶点和索引缓冲区导入 DirectX 11

DirectX11 C++ 着色器缓冲区在多边形布局描述中变为空

C++ 中的高效循环缓冲区,将传递给 C 风格的数组函数参数

std :: deque(双端队列)真的是随机访问和恒定时间插入吗?