参考链接-/https://catlikecoding.com/unity/tutorials/
1、在pass伊始的时候加入预编译
#pragma multi_compile_instancing
这会生成两个shader变种,有关 #pragma multi_compile参阅unity官方手册。在材质中会增加一个toggle表明你要选择哪一种。此处勾选上。
2、包含unity内置头文件,注意和SpaceTransforms.hlsl的引入顺序
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"
此文件的作用是:重新定义访问实例化数组的宏。在此之前,需要获取到每个需要被渲染的物体的索引。注:通常所有的物体顶点会一起组合成一个数组被提交,与之对应的还有顶点描述结构体(directx11中称之为view或discriptor,记得貌似是。不去翻了,自行求证)。
还需要保证顶点着色器的输入得是一个结构体。
float4 UnlitPassVertex (float3 positionOS : POSITION):SV_POSITION
改为:
struct Attributes
{
float3 positionOS : POSITION;
};
float4 UnlitPassVertex (Attributes input):SV_POSITION
3、将实例化相关宏插入到代码
输入结构体加入UNITY_VERTEX_INPUT_INSTANCE_ID
struct Attributes
{
float3 positionOS : POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
顶点作色器加入UNITY_SETUP_INSTANCE_ID(input);:
float4 UnlitPassVertex (Attributes input):SV_POSITION
{
UNITY_SETUP_INSTANCE_ID(input);
return TransformObjectToHClip(input.positionOS);
}
材质输入参数_BaseColor改为:(貌似要pixelshader中访问的数据需要加上UNITY_DEFINE_INSTANCED_PROP)
UNITY_INSTANCING_BUFFER_START(UnityPerMaterial)
UNITY_DEFINE_INSTANCED_PROP(float4, _BaseColor)
UNITY_INSTANCING_BUFFER_END(UnityPerMaterial)
增加一个顶点着色器的输出结构体:
struct Varyings {
float4 positionCS : SV_POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
将顶点着色器返回值类型改为Varyings ,去掉SV_POSITION。注意添加:UNITY_TRANSFER_INSTANCE_ID(input, output);
Varyings varyings;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_TRANSFER_INSTANCE_ID(input, output);
varyings.positionCS = TransformObjectToHClip(input.positionOS)
return varyings;
将片段着色器增加一个输入参数,而后增加:UNITY_SETUP_INSTANCE_ID(input);
特别注意,现在是返回:UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _BaseColor);
float4 UnlitPassFragment(Varyings input): SV_TARGET
{
UNITY_SETUP_INSTANCE_ID(input);
return UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _BaseColor);;
}