使用DirectX 11&效果11,我试图了解如何有效地绘制具有不同着色器的两个对象。所以首先我设置所有状态并为所有状态设置常量缓冲区。在迭代所有第一个对象的网格时,所有先前设置的常量缓冲区都保持可用,这很好,你可以看到 here.
然后我应用另一个传递(Effect 11中的Pass.Apply())来绘制第二个对象。在这一点上,我所有的常量缓冲区都是 destroyed as shown there.
所以现在我开始想知道在应用启动时是否所有常量缓冲区都不能设置为一次,然后在任何着色器中随时使用/共享。或者它只属于活动着色器?
谢谢!
答案 0 :(得分:0)
如果我记得,如果执行不同的效果,则必须将常量缓冲区重新关联到舞台(这也可能取决于驱动程序)。如果您没有更改着色器的状态,那么您应该重用相同的常量缓冲区的唯一时间。
为了安全起见,一个不同的Pass基本上绑定了一组新的着色器(如果它们不同)。最佳做法是每次执行不同的效果传递时绑定资源(缓冲区)。
我个人已经离开了Effects,因为它已被弃用,我还发现明确了解我绑定到管道的内容有助于我理解常量缓冲区的使用。
缓冲区不应该被破坏,它应该只是在第二次调用时不被绑定 - 否则你会有更邪恶的事情发生。