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

参考链接-/https://catlikecoding.com/unity/tutorials/
1、SRP Batcher
shader代码:

#ifndef CUSTOM_UNLIT_PASS_INCLUDED
#define CUSTOM_UNLIT_PASS_INCLUDED
	#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
	#include "UnityInput.hlsl"
	#define UNITY_MATRIX_M unity_ObjectToWorld
	#define UNITY_MATRIX_I_M unity_WorldToObject
	#define UNITY_MATRIX_V unity_MatrixV
	#define UNITY_MATRIX_VP unity_MatrixVP
	#define UNITY_MATRIX_P glstate_matrix_projection
	#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"
	
	CBUFFER_START(UnityPerMaterial)
	float4 _BaseColor;
	CBUFFER_END

	float4 UnlitPassVertex (float3 positionOS : POSITION):SV_POSITION  
	{
		return TransformObjectToHClip(positionOS);
	}
	float4 UnlitPassFragment(): SV_TARGET 
	{
		return _BaseColor;
	}
#endif

主要关注下:

	#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
	#include "UnityInput.hlsl"
	#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"

Common.hlsl和SpaceTransforms.hlsl是unity内置的shader片段文件,前者是公用的一些方法以及宏定义等。后者包含位置变换的方法。
UnityInput.hlsl是自定义的hlsl文件,主要是一些位置globe常量。一定要在SpaceTransforms.hlsl之前,在Common.hlsl之后。因为要用到
Common.hlsl中的real定义。接下来做宏替换,使SpaceTransforms中的方法能返回正确的变量。
Common.hlsl:

#ifndef CUSTOM_UNITY_INPUT_INCLUDED
#define CUSTOM_UNITY_INPUT_INCLUDED
CBUFFER_START(UnityPerDraw)
	float4x4 unity_ObjectToWorld;
	float4x4 unity_WorldToObject;
	float4 unity_LODFade;
	real4 unity_WorldTransformParams;
CBUFFER_END
	float4x4 unity_MatrixVP;
	float4x4 unity_MatrixV;
	float4x4 glstate_matrix_projection;

#endif

至于全部变量又由何地方给值…目前未知,有答案会更新的。反正结果是被赋值了,并且渲染正确。
要是SRP Batcher生效,注意点如下:

  GraphicsSettings.useScriptableRenderPipelineBatching = true;//启用
	输入参数要被CBUFFER_START CBUFFER_END包裹
	CBUFFER_START(UnityPerMaterial)
	float4 _BaseColor;
	CBUFFER_END
以及input中的全局变量也要被CBUFFER_START CBUFFER_END包裹,注意要加入这个float4 unity_LODFade,尽管没有被用到。
CBUFFER_START(UnityPerDraw)
	float4x4 unity_ObjectToWorld;
	float4x4 unity_WorldToObject;
	float4 unity_LODFade;
	real4 unity_WorldTransformParams;
CBUFFER_END

结果如下:
在unity中高性能的绘制相同网格和材质的物体-SRP Bather_第1张图片
在unity中高性能的绘制相同网格和材质的物体-SRP Bather_第2张图片

你可能感兴趣的:(Unity,unity,shader)