在unity中高性能的绘制相同网格和材质的物体-GPU Instance

本文介绍了如何在Unity中实现GPU实例化,以提高性能,特别是处理大量具有相同网格和材质的物体。通过预编译Shader、包含Unity内置头文件并调整宏,可以实现对实例化数组的访问,确保顶点着色器和片段着色器正确处理实例数据,从而优化渲染过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接-/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);;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值