纹理和采样器不是 Unity 中的单独对象,因此要在计算着色器中使用它们,必须遵循以下 Unity 特定规则之一:
使用与纹理名称相同的名称,以 sampler 开头(例如,Texture2D MyTex;SamplerState samplerMyTex)。在此情况下,采样器将初始化为纹理的过滤/包裹/各向异性 (filter/wrap/aniso) 设置。
使用预定义采样器。因此,该名称必须具有 Linear 或 Point(对于过滤模式)和 Clamp 或 Repeat(包裹模式)。例如,SamplerState MyLinearClampSampler 会创建一个具有线性过滤模式和钳制包裹模式的采样器。
有关更多信息,请参阅有关采样器状态的文档。
可以使用关键字来生成计算着色器的多个变体,与图形着色器相同。
有关变体的一般信息,请参阅着色器变体。有关如何在计算着色器中实现这些功能的信息,请参阅 在 HLSL 中声明和使用着色器关键字以及 ComputeShader API 文档。
通常情况下会以 HLSL 编写计算着色器文件,并自动将这些文件编译或转换到所有需要的平台中。但是,可以阻止转换为其他语言(即仅保留 HLSL 平台)或者手动编写 GLSL 计算代码。
以下信息仅适用于仅限 HLSL 或仅限 GLSL 的计算着色器,而不适用于跨平台版本。这是因为此信息可能导致计算着色器源代码被排除在某些平台之外。
对于非 HLSL 平台,不会处理由 CGPROGRAM 和 ENDCG 关键字包围的计算着色器源代码。
由 GLSLPROGRAM 和 ENDGLSL 关键字包围的计算着色器源代码视为 GLSL 源代码,并逐字发出。这仅在目标平台为 OpenGL 或 GLSL 平台时才奏效。还应注意,虽然自动转换的着色器遵循缓冲区上的 HLSL 数据布局,但是手动编写的 GLSL 着色器将遵循 GLSL 布局规则。