gpt4 book ai didi

c++ - DirectCompute 着色器数据输入/输出

转载 作者:行者123 更新时间:2023-11-30 03:49:20 27 4
gpt4 key购买 nike

我正在学习 DirectCompute,并且一直在使用 StructuredBufferes。事情是我了解到,要向着色器提供数据,我需要使用 View - SRV 或 UAV,具体取决于我想要实现的目标。但是微软网站的代码示例并没有解释,C++代码中定义的 View 如何对应于着色器代码中定义的特定Buffer。然而,有一个hlsl关键字我不是很明白——register()。在示例中有三个缓冲区:

    StructuredBuffer<BuffType> Buff0 : register(t0);
StructuredBuffer<BuffType> Buff1 : register(t1);
RWStructuredBuffer<BuffType> BuffOut : register(u0);

在 C++ 代码中,作者只是设置了 ComputeShader、1 架无人机、2 架 SRV,然后调用 Context.Dispatch(,,)(假设他们之前已经准备好所有缓冲区和 View )。所以问题是——我如何理解特定的 SRV(有两个)为特定的 StructuredBuffer 提供数据?它是否由寄存器编号控制(例如首先填充寄存器(t0),然后再填充寄存器(t1))。如果是,如果我想先向第二个缓冲区提供数据,然后再填充第一个缓冲区怎么办?我觉得我自己错过了一些非常重要的东西,但在以前的教程中,由于 EffectVariales 和 .GetVariableBy 方法,我使用一切都容易得多。提前致谢。

最佳答案

在着色器中声明的寄存器绑定(bind)对应于绑定(bind)数组参数中的索引。例如,如果您调用 CSSSetShaderResources(7/*StartSlot*/, 3/*NumViews*/, viewArray);,这会将 viewArray[0] 绑定(bind)到 register(t7)viewArray[1]register(t8)viewArray[2]注册(t9)。请注意,如果 viewArray 的元素之一是 NULL,这将有效地解除绑定(bind)相应的寄存器槽。

请注意,在 HLSL 中,省略显式 register 绑定(bind)将自动从 0 开始分配寄存器。在常见情况下,StartSlot 将为 0,因此您只需要确保 viewArray 中的 View 顺序与着色器中的声明顺序相匹配。不过,最好的做法是显式分配寄存器并确保它们与您的绑定(bind)数组匹配,因为如果 HLSL 编译器确定您不需要声明的 View 之一,它会消除它并且不会 跳过它在隐式赋值中的位置。例如:

StructuredBuffer<float> foo; // register(t0)
StructuredBuffer<float> bar; // eliminated!
StructuredBuffer<float> baz; // register(t1) // skipped over bar!
RWStructuredBuffer<float> biz; // register(u0)
void main()
{
float x = foo[0];
if(x < 0) x = 0;
else if(x >= 0) x = 1;
else x = bar[0]; // branch never hit, compiler optimizes out the only use of bar!
biz[0] = x + baz[0];
}

关于c++ - DirectCompute 着色器数据输入/输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32613755/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com