本节将介绍与 GPU 实例化相关的着色器添加。
| 添加 | 描述 |
|---|---|
#pragma multi_compile_instancing |
生成实例化变体。片元着色器和顶点着色器必备。对表面着色器可选。 |
#pragma instancing_options
|
指定 Unity 用于实例的选项。如需了解可用选项开关的信息,请参阅 #pragma instancing_options。 |
UNITY_VERTEX_INPUT_INSTANCE_ID |
在顶点着色器输入/输出结构体中定义实例 ID。要使用此宏,请启用 INSTANCING_ON 着色器关键字。否则 Unity 将不会设置实例 ID。 要访问实例 ID,请在 #ifdef INSTANCING_ON 代码块中使用 vertexInput.instanceID。如果不使用此代码块,则变体的编译将失败。 |
UNITY_INSTANCING_BUFFER_START(bufferName) |
声明名为 bufferName 的逐实例常量缓冲区的开头。与 UNITY_INSTANCING_BUFFER_END 一起使用此宏来封装各实例唯一属性的声明。使用 UNITY_DEFINE_INSTANCED_PROP 声明缓冲区内的属性。 |
UNITY_INSTANCING_BUFFER_END(bufferName) |
声明名为 bufferName 的逐实例常量缓冲区的末尾。与 UNITY_INSTANCING_BUFFER_START 一起使用此宏来封装各实例唯一属性的声明。使用 UNITY_DEFINE_INSTANCED_PROP 声明缓冲区内的属性。 |
UNITY_DEFINE_INSTANCED_PROP(type, propertyName) |
定义带有指定类型和名称的逐实例着色器的属性。在以下示例中,_Color 属性唯一。 |
UNITY_SETUP_INSTANCE_ID(v); |
允许着色器函数访问实例 ID。对于顶点着色器,开头必需使用此宏。对于片元着色器,此添加项可选。示例见顶点和片元着色器。 |
UNITY_TRANSFER_INSTANCE_ID(v, o); |
将实例 ID 从顶点着色器的输入结构体复制到输出结构体中。仅当需要访问片元着色器中的逐实例数据时,才有必要使用此宏。 |
UNITY_ACCESS_INSTANCED_PROP(bufferName, propertyName) |
访问在实例化常量缓冲区中的逐实例着色器的属性。Unity 使用实例 ID 对实例数据数组进行索引。bufferName 必须与包含指定属性的常量缓冲区的名称相匹配。对于 INSTANCING_ON 和非实例化变体,此宏的编译方式有所不同。 |
[#pragma instancing_options](#pragma-instancing_options) 指令可以使用以下开关:
| 开关 | 描述 |
|---|---|
forcemaxcount:batchSize 和 maxcount:batchSize
|
在大多数平台上,Unity 会自动计算实例化数据数组的大小。它会将目标设备上的最大常量缓冲区大小与包含所有逐实例属性的结构体大小相除。通常您不必担心批次的大小。但某些平台要求固定大小的数组。要为这些平台指定批次大小,请使用 maxcount 选项。其他平台会忽略此选项。如果要为所有平台强制设置批次大小,请使用 forcemaxcount。例如,当项目使用 RenderMeshInstanced 发出包含 256 个实例化精灵的绘制调用时,该选项就非常有用。这两个选项的默认值为 500。 |
assumeuniformscaling |
令 Unity 假设所有实例都具有统一的缩放(所有 X、Y 和 Z 轴的比例都相同)。 |
nolodfade |
令 Unity 不对 LOD 淡入淡出值应用 GPU 实例化。 |
nolightprobe |
防止 Unity 对光照探针的值及其遮挡数据应用 GPU 实例化。如果项目不包含同时使用 GPU 实例化和光照探针的__ GameObject__Unity 场景中的基础对象,可以表示角色、道具、风景、摄像机、路径点等。GameObject 的功能由所附的组件决定。更多信息 See in Glossary,则将此选项设为 ON 可提高性能。 |
nolightmap |
防止 Unity 对光照贴图图集信息的值应用 GPU 实例化。如果项目不包含同时使用 GPU 实例化和光照贴图的 GameObject,则将此选项设置为 ON 可提高性能。 |
procedural:FunctionName |
生成一个额外变体以配合 Graphics.RenderMeshIndirect 使用。在顶点着色器阶段开始时,Unity 会调用在冒号后指定的函数。要手动设置实例数据,请按照通常将逐实例数据添加到着色器的方式将逐实例数据添加到此函数。如果片元着色器中包含任何获取的实例属性,Unity 还会在片元着色器的开头调用此函数。 |