计算着色器

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

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

计算着色器资源

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

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

// test.compute
#pragma kernel FillWithRed

RWTexture2D<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 的特定规则:

Page last updated: 2013-06-26