返回介绍

计算着色器

发布于 2021-06-19 18:03:26 字数 2167 浏览 932 评论 0 收藏 0

计算着色器 (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 的特定规则:

  • 使用与纹理名称相同的名称,以 "sampler" 开头(例如 Texture2D MyTex; SamplerState samplerMyTex)。在这种情况下,程序会将采样器初始化为纹理的过滤/循环/各向异性设置。
  • 或使用一个“预定义”采样器;名称必须包含“线性 (Linear)” 或“点 (Point)”(适用于过滤模式)和“强制拉伸 (Clamp)” 或“重复 (Repeat)”(适用于循环模式)。例如,"SamplerState MyLinearClampSampler" - 这将包含线性过滤和强制拉伸循环模式。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文