文章目录
- 前言
- 一、GPU实例化的Shader准备步骤
- 1、在Pass中声明实例化需要的变体
- 2、UNITY_VERTEX_INPUT_INSTANCE_ID 在顶点着色器的输入(appdata)和输出(v2f可选)中添加(uint instanceID : SV_InstanceID).
前言
在上篇文章中,我们做了一些GPU实例化的前置准备,这篇文章主要来准备一下Shader支持GPU实例化的步骤中的GPU实例化ID准备。
- Unity中Batching优化的GPU实例化(1)
一、GPU实例化的Shader准备步骤
用于对多个对象(网格一样,材质一样,但是材质属性不一样)合批,单个合批最大上限为511个对象.
1.#pragma multi_compile_instancing 添加此指令后会使材质面板上曝露Instaning开关,同时会生成相应的Instancing变体(INSTANCING_ON).
2.UNITY_VERTEX_INPUT_INSTANCE_ID 在顶点着色器的输入(appdata)和输出(v2f可选)中添加(uint instanceID : SV_InstanceID).
3.构建需要实例化的额外数据:
#ifdef UNITY_INSTANCING_ENABLED
UNITY_INSTANCING_BUFFER_START(prop自定义名字)
UNITY_DEFINE_INSTANCED_PROP(vector, _BaseColor)
UNITY_INSTANCING_BUFFER_END(prop自定义名字)
#endif
4.UNITY_SETUP_INSTANCE_ID(v); 放在顶点着色器/片断着色器(可选)中最开始的地方,这样才能访问到全局变量unity_InstanceID.
5.UNITY_TRANSFER_INSTANCE_ID(v, o); 当需要将实例化ID传到片断着色器时,在顶点着色器中添加.
6.UNITY_ACCESS_INSTANCED_PROP(arrayName, propName) 在片断着色器中访问具体的实例化变量.
1、在Pass中声明实例化需要的变体
这个变体做了两件事,定义一个开启GPU实例化的开关,同时定义了一个变体
#pragma multi_compile_instancing
- 开启变体开关
- 变体
目前我们已经可以 把这些生成的多个物体合批成一批了,但是渲染的位置不对,会重合成一个位置
2、UNITY_VERTEX_INPUT_INSTANCE_ID 在顶点着色器的输入(appdata)和输出(v2f可选)中添加(uint instanceID : SV_InstanceID).
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 pos : SV_POSITION;
float3 worldPos : TEXCOORD4;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
- 在UnityInstancing.cginc文件中,看一下Unity这句话做了什么
- UNITY_VERTEX_INPUT_INSTANCE_ID
这里知道原理后,不建议自己改写。虽然,最后只是定义了一句话。但是,需要满足很多条件才可以定义
- UNITY_INSTANCING_ENABLED : GPU实例化能开启的情况
- UNITY_SUPPORT_INSTANCING : GPU实例化硬件支持
之后的步骤在下一篇文章中解析。