版本:Unity 6 (6000.0)
语言:英语
防止 Unity 在内置渲染管线中剥离 GPU 实例化着色器
图形性能和分析参考

内置渲染管线 GPU 实例化着色器参考

本节包含与着色器在 GPU 上运行的程序。 更多信息
请参阅 词汇表
相关联的 GPU 实例化添加内容的信息。

添加内容 描述
#pragma multi_compile_instancing 生成实例化变体。这是片段和顶点着色器在渲染 3D 模型时在模型的每个顶点上运行的程序。 更多信息
请参阅 词汇表
所需的。对于表面着色器用于编写内置渲染管线着色器的简化方法。 更多信息
请参阅 词汇表
,这是可选的。
#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:batchSizemaxcount:batchSize 在大多数平台上,Unity 会自动计算实例化数据数组大小。它将目标设备上的最大常量缓冲区大小除以包含所有每个实例属性的结构的大小。通常,您无需担心批次大小。但是,某些平台需要固定的数组大小。要为这些平台指定批次大小,请使用 maxcount 选项。其他平台会忽略此选项。如果您想强制对所有平台使用批次大小,请使用 forcemaxcount。这在例如您的项目使用 RenderMeshInstanced 发出包含 256 个实例化精灵2D 图形对象。如果您习惯使用 3D,精灵本质上只是标准纹理,但存在专门的技术用于组合和管理精灵纹理,以便在开发过程中提高效率和方便性。 更多信息
请参阅 词汇表
的绘制调用时很有用。这两个选项的默认值为 500。
assumeuniformscaling 指示 Unity 假设所有实例都具有均匀缩放(所有 X、Y 和 Z 轴的缩放相同)。
nolodfade 使 Unity 不将 GPU 实例化应用于LOD细节等级 (LOD) 技术是一种优化,它在 GameObject 距离摄像机越来越远时减少 Unity 需要渲染的三角形数量。 更多信息
请参阅 词汇表
淡入淡出值。
nolightprobe 阻止 Unity 将 GPU 实例化应用于光线探测器光线探测器存储有关光线如何穿过场景中空间的信息。在给定空间内排列的光线探测器集合可以改善该空间内移动物体和静态 LOD 场景的照明。 更多信息
请参阅 词汇表
值及其遮挡数据。如果您的项目不包含使用 GPU 实例化和光线探测器的游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、航点等。游戏对象的功能由附加到它的组件定义。 更多信息
请参阅 词汇表
,将此选项设置为 ON 可以提高性能。
nolightmap 阻止 Unity 将 GPU 实例化应用于光照贴图预渲染的纹理,包含场景中静态物体上光源的影响。光照贴图叠加在场景几何体上,以创建照明效果。 更多信息
请参阅 词汇表
图集信息值。如果您的项目不包含使用 GPU 实例化和光照贴图的游戏对象,将此选项设置为 ON 可以提高性能。
procedural:FunctionName 为与 Graphics.RenderMeshIndirect 一起使用生成其他变体。在顶点着色器阶段的开头,Unity 会调用冒号后面指定的函数。要手动设置实例数据,请将每个实例数据添加到此函数中,就像您通常将每个实例数据添加到着色器一样。如果任何获取的实例属性包含在片段着色器中,Unity 也会在片段着色器的开头调用此函数。
防止 Unity 在内置渲染管线中剥离 GPU 实例化着色器
图形性能和分析参考