Unity中Batching优化的GPU实例化(2)


前言

在上篇文章中,我们做了一些GPU实例化的前置准备,这篇文章主要来准备一下Shader支持GPU实例化的步骤中的GPU实例化ID准备。


一、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实例化硬件支持

在这里插入图片描述


之后的步骤在下一篇文章中解析。

猜你喜欢

转载自blog.csdn.net/qq_51603875/article/details/134849406