【问题标题】:Vulkan Shader & Resources: Why Uniform and not Const ResourcesVulkan 着色器和资源:为什么使用 Uniform 而不是 Const Resources
【发布时间】:2020-02-24 13:15:05
【问题描述】:

我们通常在 c++ 中使用 const 来暗示值不会改变(只读),为什么在 GLSL/VK 中的着色器或资源定义中他们选择词制服? Wodn`t更加一致并使用从c/c++

借来的关键字

除此之外,着色器定义中的 uniform 关键字可能会为编译器提供线索以将这些资源附加到尽可能靠近硬件的位置,可能是 shared memoryregisters ?不确定。

这也可能是他们在 VkSpec 中提到的原因。对于这些类型的资源,我们需要少量数据。例如:宇宙常数的值..etc

是我遗漏了什么,或者一些已经逝去的历史吗?

【问题讨论】:

    标签: resources shader vulkan


    【解决方案1】:

    GPU 编程中的 Uniforms 和 C++ 中的 const 专注于不同的事情。

    C++ const 记录了一个变量不打算被改变,有一些编译器强制执行。因此,它更多地是关于使用类型系统来提高清晰度并强制执行预期用途——这对于大型项目软件工程很重要。你仍然可以通过 const_cast 或其他技巧来绕过它,编译器不能假设你没有,所以它没有被严格执行。

    关于制服的重要一点是,它们是统一的。这意味着无论何时在绘图调用中读取它们时,它们都具有相同的值。由于在一次绘制调用中可能会对该值进行数百到数百万次读取,因此可以对其进行缓存,并且仅缓存一份副本,或者可以在着色器运行之前将其预加载到寄存器(或缓存)中,它可以被缓存在一个非连贯的缓存中,单个读取结果可以在一个核心中的所有 SIMD 通道上广播,等等。为此,必须严格执行内容不能更改的事实(现在,使用内存别名,您甚至可以解决这个问题,但是如果这样做,结果将非常不确定)。因此,uniform 实际上并不是向其他程序员声明意图以获得软件工程的好处,如 const 是,它是关于向编译器和驱动程序声明意图,以便他们可以基于它进行优化。

    D3D 使用“const”和“constant buffer”而不是uniform,所以显然有一些重叠。尽管这确实会导致诸如“您每帧更新多少次常量?”之类的说法。当您想到它时,说起来有点奇怪:)。这些值在着色器代码中是恒定的,但在 API 级别中很多不是恒定的。

    【讨论】:

      【解决方案2】:

      这个词的词源在这里很重要。 “uniform”一词源自 GLSL,它受到 Renderman 标准的着色器术语的启发。 In Renderman,“uniform”用于值“其值在表面的任何部分开始着色时都是恒定的”。这是“变化”的替代方法,它表示在表面上插值的值。

      “常量”意味着值从不改变。统一的价值观确实会改变;它们根本不会以与其他值相同的频率变化。输入值在每次调用时更改,统一值在每次绘制调用时更改,并且常量值不会更改。请注意,在 GLSL 中,const 通常表示“编译时常量”:在编译时设置且永远不会更改的值。

      Vulkan 中的统一变量最终来自着色器之外的资源。由缓冲区提供的统一变量块,由推常量状态提供的推常量中的统一都是外部资源,由用户设置。这是一个与编译时常量结构完全不同的概念。

      由于它与常量结构不同,它需要一个不同的术语来请求它。

      【讨论】:

        猜你喜欢
        • 2018-03-11
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多