- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 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/
在计算着色器(使用 Unity)中,我有一个光线转换寻找与网格三角形的交点。在某些时候,我想返回找到了多少个交叉点。 我可以通过标记像素清楚地看到有多少个交叉点,但是如果我只是为计算着色器中的每个交叉
我正在寻找 OpenCL 之间的比较和 DirectCompute ,但我还没有发现任何东西。 OpenCL 的跨平台优势和支持更广泛的 GPU 对我来说并不重要。我只适合在 Windows 上针对
我正在学习 DirectCompute,并且一直在使用 StructuredBufferes。事情是我了解到,要向着色器提供数据,我需要使用 View - SRV 或 UAV,具体取决于我想要实现的目
我尝试在计算着色器中实现自旋锁。但是我的实现似乎没有锁定任何东西。 下面是我如何实现自旋锁: void LockAcquire() { uint Value = 1; [allow_u
我最近一直在使用计算着色器,我正在尝试确定设置 [numthreads(x,y,z)] 和调度调用的最佳方法。我的演示窗口是 800x600,我每像素启动 1 个线程。我正在执行 2D 纹理修改 -
我有以下缓冲区: RWTexture2D Output : register(u0); 计算着色器使用此缓冲区来渲染计算图像。要在该纹理中写入像素,我只需使用与此类似的代码: Output[XY] =
我有以下缓冲区: RWTexture2D Output : register(u0); 计算着色器使用此缓冲区来渲染计算图像。要在该纹理中写入像素,我只需使用与此类似的代码: Output[XY] =
我正在尝试在 GPU 内存中创建缓冲区以从 CPU 上传数据。 GPU 访问将是只读的。数据将用作计算着色器的输入缓冲区。 CreateBuffer() 失败并出现错误 0x80070057 (E_I
我有一些(财务)任务应该很好地映射到 GPU 计算,但我不确定我是否应该使用 OpenCL 或 DirectCompute。我做了一些 GPU 计算,但那是很久以前(3 年)。我是通过 OpenGL
我是一名优秀的程序员,十分优秀!