首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectCompute着色机数据输入/输出

DirectCompute着色机数据输入/输出
EN

Stack Overflow用户
提问于 2015-09-16 16:15:10
回答 1查看 839关注 0票数 1

我正在学习DirectCompute,我被StructuredBufferes困住了。事情是我学到的是,为了提供数据给着色器,我需要使用一个视图- SRV或无人机,这取决于我试图实现什么。但是来自Microsoft的代码示例并不解释,在C++代码中定义的视图如何对应于着色代码中定义的特定缓冲区。然而,有一个hlsl关键字我不太明白- register()。在样本中有三个自助餐:

代码语言:javascript
复制
    StructuredBuffer<BuffType> Buff0 : register(t0);
    StructuredBuffer<BuffType> Buff1 : register(t1);
    RWStructuredBuffer<BuffType> BuffOut : register(u0);

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

EN

回答 1

Stack Overflow用户

发布于 2015-10-09 19:41:36

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

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

代码语言:javascript
复制
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];
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32613755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档