当前位置:   article > 正文

Unity中Batching优化的GPU实例化(2)_unity图形序列使用gpu处理

unity图形序列使用gpu处理


前言

在上篇文章中,我们做了一些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
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 在UnityInstancing.cginc文件中,看一下Unity这句话做了什么
  • UNITY_VERTEX_INPUT_INSTANCE_ID

这里知道原理后,不建议自己改写。虽然,最后只是定义了一句话。但是,需要满足很多条件才可以定义

在这里插入图片描述

  • UNITY_INSTANCING_ENABLED : GPU实例化能开启的情况

在这里插入图片描述

  • UNITY_SUPPORT_INSTANCING : GPU实例化硬件支持

在这里插入图片描述


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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/37738
推荐阅读
相关标签
  

闽ICP备14008679号