我正在创建着色器管理系统,而不是使用Effects 11库。关于着色器的资源管理,我有几个问题。
如果我在着色器代码中将常量缓冲区设置为某个寄存器,那么当我在设备上设置它时是否需要将其设置为该寄存器?如果我有多个使用该寄存器的着色器怎么办?
在绘制之间是否在内存中保留了常量缓冲区,还是它们被清除了?比方说,我有一个不会从最后一次抽奖改变的常量缓冲区,我是否需要重新设置?
一次设置一个常量缓冲区或一次设置所有缓冲区是否较慢?
提前致谢。
答案 0 :(得分:2)
是的,您需要设置该寄存器,将其视为一个常量缓冲区。
是的,它会保留在那里,直到你用另一个切换它。
“一次设置一个常量缓冲区或一次设置所有缓冲区是否较慢?”
“一下子”是什么意思?
无论如何,请查看此nvidia演示文稿,了解有关cbuffer管理的详细信息: https://developer.nvidia.com/sites/default/files/akamai/gamedev/files/gdc12/Efficient_Buffer_Management_McDonald.pdf
请注意,如果在hlsl代码上使用完全相同的“变量”,则像素着色器和顶点着色器(不同着色器类型)使用不同的寄存器。这是为你处理的,要注意的是要将cbuffer更新到寄存器,你使用像素着色器版本的d3d函数(VSSetConstantBuffer vs PSSetConstantBuffer等)。那当然是所有类型的着色器。
所以例如,在hlsl代码中,你可以使用相同的槽(寄存器)有2个常量缓冲区,但是,记住不要在同一个着色器上使用它们。或者,再次,你可以使用相同的常量缓冲区在两个着色器上,只要记住它不一样。