View 的话有以下几种:
ID3D11ConstantBufferView(CBV),表示 Resource 是只读的 Buffer。
ID3D11ShaderResourceView(SRV),表示 Resource 是只读的 Texture。
Compute shader ce8a4f41e18845b0ac4fb1978f28869f.md
ID3D11RenderTargetView(RTV),表示 Resource 是只写的 RenderTarget。
ID3D11DepthStencilView(DSV),表示 Resource 是只写的 DepthStencil。
ID3D11UnorderedAccessView(UAV),表示 Resource 可以随机读写。
// 创建 | |
**FRDGBufferRef** ObjectIndexBuffer = GraphBuilder.CreateBuffer(**FRDGBufferDesc**::*CreateStructuredDesc*(sizeof(**uint32**), MaxSDFMeshObjects), TEXT("ObjectIndices")); | |
// 创建 UAV,并且写入数据 | |
PassParameters->RWObjectIndexBuffer = GraphBuilder.CreateUAV(ObjectIndexBuffer, PF_R32_UINT); | |
// 创建 SRV,别人读取他的数据 | |
PassParameters->ObjectIndexBuffer = GraphBuilder.CreateSRV(ObjectIndexBuffer, PF_R32_UINT); |
HLSL 使计算着色器的线程能够通过共享内存交换值。HLSL 提供了诸如 **GroupMemoryBarrierWithGroupSync** 等屏障原语,以确保在着色器中对共享内存进行正确的读取和写入顺序,并避免数据竞争。
将全局变量标记为着色器的外部输入;这是所有全局变量的默认标记。 不能与 static
组合。
在将顶点着色器的输出传递给像素着色器之前,不要对它们进行插值。
标记一个局部变量,以便它被初始化一次并在函数调用之间保持不变。如果声明不包含初始值设定项,则该值设置为零。标记为静态的全局变量对应用程序不可见。
标记一个变量,其数据在整个着色器的执行过程中保持不变(例如顶点着色器中的材质颜色);默认情况下,全局变量被认为是统一的。
标记一个经常变化的变量;这是对编译器的提示。此存储类修饰符仅适用于局部变量。
[!Note]
HLSL 编译器当前忽略此存储类修饰符。
添加了 branch 标签的 if 语句 shader 会根据判断语句只执行当前情况的代码,这样会产生跳转指令。
添加了 flatten 标签的 if 语句 shader 会执行全部情况的分支代码,然后根据判断语句来决定使用哪个结果
添加了 unroll 标签的 for 循环是可以展开的,直到循环条件终止,代价是产生更多机器码,意思是每一次循环都写成新一行代码
至于 “为什么”,循环有一些开销,所以展开的情况通常更快。但占用内存更多,听说这样在 for 读 texture 会安全点
指定 [loop] 时,循环在编译后的汇编代码中描述,内存大小被抑制,但执行速度稍慢。