【问题标题】:What is a good way to manage state when swapping out Direct3D 11 shaders?换出 Direct3D 11 着色器时管理状态的好方法是什么?
【发布时间】:2011-02-25 18:26:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: directx rendering buffer state shader


    【解决方案1】:

    由于您没有从 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);
    

    所以我的粒子着色器有一个缩减集,但 DepthMap 纹理仍然在同一个槽中...

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

    我不知道这在多大程度上适用于 D3D11,但我希望它有点用处。

    【讨论】:

    • 哦,我明白了,我做出了一个错误的假设,即每次交换着色器时我都必须再次传递数据,而如果我将它们存储在不同的寄存器中,它们会一直保留在那里根据我的需要。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多