【问题标题】:DirectX 11 Shader Resource ManagementDirectX 11 着色器资源管理
【发布时间】:2014-08-28 02:13:56
【问题描述】:

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

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

在两次绘制之间是否在内存中保留了常量缓冲区,或者它们是否被清除?例如,我有一个与上次绘制相比没有更改的常量缓冲区,我需要重新设置它吗?

一次一个或一次设置一个常量缓冲区会更慢吗?

提前致谢。

【问题讨论】:

    标签: c++ resources directx shader directx-11


    【解决方案1】:

    是的,你需要设置那个寄存器,把它想象成一个常量缓冲槽。

    是的,它会一直保留在那里,直到您将其切换到另一个位置。

    “一次设置一个常量缓冲区还是一次设置所有缓冲区会更慢吗?”

    “一次全部”是什么意思?

    无论如何,请查看此 nvidia 演示文稿以获取有关 cbuffer 管理的重要信息: https://developer.nvidia.com/sites/default/files/akamai/gamedev/files/gdc12/Efficient_Buffer_Management_McDonald.pdf

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

    因此,例如,在 hlsl 代码中,您可以有 2 个使用相同插槽(寄存器)的常量缓冲区,但是,请记住不要在同一个着色器上同时使用这两个缓冲区。或者,再次,您可以使用相同的常量缓冲区在这两个着色器上,请记住它们并不完全相同。

    【讨论】:

    • 感谢您的详细回复。一下子,我的意思是有一个函数 VSSetConstantBuffers 将缓冲区数组作为参数,并根据起始输入槽顺序设置它们。那么是一次全部设置好,还是多次调用这个函数好呢?
    • 当然是一次性的。这将使与驱动程序的任何通信立即发生(更不用说 1 个函数调用与很多)。它基本上是功能存在的目的。
    • 一些后续问题:如何使用同一个寄存器处理 2 个着色器?我需要在绘图调用之间设置常量缓冲区吗?顶点和索引缓冲区呢?我绘制的每个网格应该使用相同的输入槽,还是应该使用不同的输入槽?还是输入插槽允许将不同的数据设置到 GPU?
    • 使用 PS/VS/'x'S 版本的 SetConstantBuffer 就足够了(设置时无所谓),您显然不会在同一个绘图调用中使用相同的 2 个着色器。通常,所有网格将使用相同的插槽,并且您将为不同的网格设置不同的 VB/IB(每个网格有不同的绘制调用),在同一个插槽上(根据您之前创建的输入布局选择 VB 的插槽。 .)。当使用相同的渲染技术时,可以将其视为使用相同的配置(VS、PS、Slots)、不同的参数(VB、CBs)。
    • 当使用相同的渲染技术时,可以将其视为使用具有不同参数(VB、CBs)的相同配置(VS、PS、Slots)。 (我的编辑时间结束了,所以我再发表一条评论)
    猜你喜欢
    • 2018-03-11
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2010-11-05
    • 2010-12-28
    相关资源
    最近更新 更多