Directx 在交换Direct3D 11着色器时,管理状态的好方法是什么?

Directx 在交换Direct3D 11着色器时,管理状态的好方法是什么?,directx,rendering,buffer,state,shader,Directx,Rendering,Buffer,State,Shader,我目前有两个着色器,一个处理着色器(顶点和像素),用于计算照明和投影变换。然后将其渲染为纹理。然后我有了第二个着色器,一个后处理着色器,它读取渲染纹理并将其输出到屏幕(同样是顶点着色器和像素着色器) 将场景渲染到纹理后,我将立即上下文的顶点和像素着色器与后处理着色器交换,但我不确定该如何管理状态(例如,纹理参数和常量缓冲区)。交换着色器,然后每帧手动重置两次常量缓冲区和纹理似乎是非常浪费的,而且从一开始就有点破坏了常量缓冲区,但据我所知,您无法在着色器对象上设置数据,它必须传递到上下文 其他人对

我目前有两个着色器,一个处理着色器(顶点和像素),用于计算照明和投影变换。然后将其渲染为纹理。然后我有了第二个着色器,一个后处理着色器,它读取渲染纹理并将其输出到屏幕(同样是顶点着色器和像素着色器)

将场景渲染到纹理后,我将立即上下文的顶点和像素着色器与后处理着色器交换,但我不确定该如何管理状态(例如,纹理参数和常量缓冲区)。交换着色器,然后每帧手动重置两次常量缓冲区和纹理似乎是非常浪费的,而且从一开始就有点破坏了常量缓冲区,但据我所知,您无法在着色器对象上设置数据,它必须传递到上下文


其他人对在调出和调出着色器时管理变量和纹理的简单有效方法有何建议?

既然D3D11专家没有回答您的问题,我就提供我有限的D3D9经验

。。。每帧两次看起来都非常浪费

“似乎”是个可疑的词。你衡量过演出命中率了吗?每帧两次听起来并不太糟糕

对于纹理,我根据用途指定纹理寄存器。我对特定材质的纹理使用寄存器=s4,在游戏开始时只指定一次。例如,我的主场景着色器具有以下功能:

sampler2D DiffuseMap : register(s0);
sampler2D DetailMap : register(s1);

sampler2D DepthMap : register(s4);
sampler2D ShadowMap : register(s5);
sampler2D LightMap : register(s6);
sampler2D PrevFrame : register(s7);
所以我的粒子着色器有一个缩减集,但是深度贴图纹理仍然在同一个插槽中

sampler2D Tex : register(s0);
sampler2D DepthMap : register(s4);

我不知道其中有多少适用于D3D11,但我希望它有一些用处。

哦,我明白了,我做出了一个错误的假设,即每次交换着色器时都必须再次传递数据,而如果我将它们存储在不同的寄存器中,它们将在需要的时间内保持不变。非常感谢