C++ DirectX 11着色器资源管理

C++ DirectX 11着色器资源管理,c++,resources,directx,shader,directx-11,C++,Resources,Directx,Shader,Directx 11,我正在创建一个着色器管理系统,而不是使用Effects 11库。关于着色器的资源管理,我有几个问题 如果在着色器代码中将常量缓冲区设置为某个寄存器,那么在设备上设置时是否需要将其设置为该寄存器?如果我有多个使用该寄存器的着色器呢 绘图之间的内存中是否保持恒定缓冲区,或者是否已清除缓冲区?比如说,我有一个恒定的缓冲区,这个缓冲区在上次绘制时没有改变,我需要重新设置吗 一次设置一个或一次设置所有常量缓冲区的速度慢吗 提前感谢。是的,您需要设置该寄存器,将其视为一个恒定的缓冲槽 是的,它会一直保持在那

我正在创建一个着色器管理系统,而不是使用Effects 11库。关于着色器的资源管理,我有几个问题

如果在着色器代码中将常量缓冲区设置为某个寄存器,那么在设备上设置时是否需要将其设置为该寄存器?如果我有多个使用该寄存器的着色器呢

绘图之间的内存中是否保持恒定缓冲区,或者是否已清除缓冲区?比如说,我有一个恒定的缓冲区,这个缓冲区在上次绘制时没有改变,我需要重新设置吗

一次设置一个或一次设置所有常量缓冲区的速度慢吗


提前感谢。

是的,您需要设置该寄存器,将其视为一个恒定的缓冲槽

是的,它会一直保持在那里,直到你换另一个

“一次设置一个或一次设置所有常量缓冲区的速度较慢吗?”

你说的“一次完成”是什么意思

无论如何,请查看此nvidia演示文稿,了解有关cbuffer管理的详细信息:

请注意,像素着色器和顶点着色器(不同的着色器类型)使用不同的寄存器,即使您在hlsl代码上使用完全相同的“变量”。这是为您处理的,需要注意的是,要将cbuffer更新到寄存器,您需要使用d3d函数的像素着色器版本(VSSetConstantBuffer vs PSSetConstantBuffer,等等)。这当然适用于所有类型的着色器


例如,在hlsl代码中,您可以使用相同的插槽(寄存器)使用两个常量缓冲区,但是,请记住不要在同一着色器上同时使用这两个常量缓冲区。或者,您也可以在两个着色器上使用相同的常量缓冲区,只需记住它实际上并不相同。

谢谢您的详细回答。我指的是有一个函数VSSetConstantBuffers,它将缓冲区数组作为参数,并根据起始输入槽顺序设置它们。那么,是一次设置它们更好,还是多次调用这个函数更好?当然是一次设置。这将使与驱动程序的任何通信立即发生(更不用说1个函数调用vs lots)。这基本上就是函数存在的目的。下面的问题:如何使用相同的寄存器处理两个着色器?是否需要在绘图调用之间设置常量缓冲区?顶点和索引缓冲区呢?我绘制的每个网格应该使用相同的输入槽,还是应该使用不同的输入槽?或者输入插槽是否允许将不同的数据设置到GPU?使用PS/VS/'x版本的SetConstantBuffer就足够了(无论何时设置),显然不会在同一绘图调用中使用相同tipe的两个着色器。通常,所有网格将使用相同的插槽,并且您将在同一插槽上为不同的网格(每个网格的不同绘制调用)设置不同的VBs/IBs(VBs插槽的选择取决于您早期创建的输入布局…)。当使用相同的渲染技术时,可以将其视为使用相同的配置(VS、PS、插槽)、不同的参数(VB、CBs)。当使用相同的渲染技术时,可以将其视为使用具有不同参数(VB、CBs)的相同配置(VS、PS、插槽)。(我的编辑时间结束了,所以我发布了另一条评论)