计算着色器        

计算着色器 (Compute Shaders) 是在普通渲染管道外的图形卡上运行的程序。可用于大规模并行通用图形处理器 (GPGPU) 算法,或提高部分游戏渲染速度。要高效利用这些着色器,需要对 GPU 架构和并行算法有深入了解;并对 DirectCompute、OpenCL 或 CUDA 有一定了解。

Unity 中的计算着色器是基于 DirectX 11 DirectCompute 技术构建而成;并且目前需要 Windows Vista 或更高版本的系统,以及支持 Shader Model 5.0 的 GPU。

计算着色器资源

计算着色器与普通着色器类似,是工程中含 *.compute 文件扩展名的资源文件。使用 DirectX 11 样式的 HLSL 语言编写而成,含有最少数量的 #pragma 编译指令,可指示将哪个函数编译为计算着色器内核。

以下是一个最小的计算着色器文件示例:

// test.compute#pragma kernel FillWithRedRWTexture2D<float4> res;[numthreads(1,1,1)]void FillWithRed (uint3 dtid :SV_DispatchThreadID){res[dtid.xy] = float4(1,0,0,1);}

上述示例未以远程方式执行任何有趣的操作,只是使用红色填充输出纹理。

此示例使用标准的 DX11 HLSL 语言,#pragma kernel FillWithRed 除外。一个计算着色器资源文件必须至少包含一个可调用的“计算内核”,并且此函数由 #pragma 指令指示。文件中可有多个内核;只需添加多行 #pragma kernel

编译此内核时,#pragma kernel 行后面可跟着一系列待定义的预处理器宏,例如:

#pragma kernel KernelOne SOME_DEFINE DEFINE_WITH_VALUE=1337#pragma kernel KernelTwo OTHER_DEFINE// ...

调用计算着色器

在脚本中,定义ComputeShader 类型的变量,将引用分配至此资源,然后使用 ComputeShader.Dispatch 函数调用这些着色器。有关更多详细信息,请参阅 ComputeShader 类的脚本组件手册。

ComputeBuffer 类与计算着色器紧密相关,可定义任意数据缓冲区(用 DX11 的专业术语表示为“结构缓冲区”)。如果渲染纹理 (Render Textures) 拥有“随意访问”标志设置(DX11 中的“无序访问视图”),也可使用计算着色器编写渲染纹理,请参阅 RenderTexture.enableRandomWrite。

计算着色器中的纹理采样器

纹理和采样器在 Unity 中不是独立的对象,要在计算着色器中使用这两者,必须遵守一些 Unity 的特定规则:

  • 使用与纹理名称相同的名称,以 "sampler" 开头(例如 Texture2D MyTex; SamplerState samplerMyTex)。在这种情况下,程序会将采样器初始化为纹理的过滤/循环/各向异性设置。

  • 或使用一个“预定义”采样器;名称必须包含“线性 (Linear)” 或“点 (Point)”(适用于过滤模式)和“强制拉伸 (Clamp)” 或“重复 (Repeat)”(适用于循环模式)。例如,"SamplerState MyLinearClampSampler" - 这将包含线性过滤和强制拉伸循环模式。

,