浅谈Batch SetPass 以及 Shader Material Texture的关系

本文探讨了Unity中Batch(Drawcall)、SetPass以及Shader、Material与Texture之间的关系。Batch在Unity中对应于glDrawElements调用,而SetPass涉及昂贵操作如更换Shader和Texture。Material作为Shader参数的界面,同一Material的不同Texture使用会导致SetPass增加。文中还提及了OpenGL的Instance绘制技术,包括其两种实现方式及其优缺点。

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

简单总结一下这些东西和opengl对应概念之间的关系。

首先unity 将glDrawElements这样的调用 称作一次Batch(以前叫Drawcall),

将对于GPU来说比较昂贵的操作称作 SetPass

昂贵的操作是指哪些呢? 

更换Shader  以及 更换Texture

还有一个不太确定,就是传递Uniform变量,猜想所谓的MateiralInstance(比如脚本中获取物体的material后改变它的color,在Inspector会看到原本的Material的名字旁边多了Instance字样) 内部实现就是给当前批次传递不同的Uniform变量,

在unity里,这会被算作SetPass.... 昂贵可能应该和unity内部的管线渲染流程有关系(不成熟猜想,unity在渲染相同材质相同mesh但transform不同的物体时,采用了instance绘制,所以传送transform矩阵没有什么消耗,是一次性的,但是如果有的同材质同mesh的物体用了不一样的uniform变量,比如颜色之类,则它就不能和这一批instance一起绘制,造成消耗,当然这可以通过unity提供的gpuInstance(和传送不同transform是同一种技术)解决)。。。

 

来到第二个话题(上面也牵涉了一点了。。。)

首先,Material是对Shader调参制作的封装界面,一般只对应一组Texture

然而就算一个Material可以被多处引用,但贴图不同(unityShader中有个开关可以这样设置),setpass也会增加。

因为Material本身是编辑器的概念,GPU只认shader和texture。。。在真正渲染的时候,虽然shader没有切换,但texture进行了切换(本质上和创建多个Material但使用相同的shader完全一样),还是属于昂贵的操作。。。setpass+1

 

顺便说下opengl的 Instance绘制是个啥

opengl有两种方式实现所谓的instance绘制,第一种比较逊色,调用gldrawArrayInstance 可以进行多次绘制,并且在顶点着色器中可以拿到当前的顶点所在的实例索引,然后你可以通过给vs传递对应长度的uniform数组,并用实例索引来拿到数组里对应的信息,达到一次batch多次绘制的目的,但传送uniform数据有大小限制

第二种方法还是需要调用gldrawArrayInstance ,但数据不通过unifrom传递 而是在drawCall之前 调用这个方法glVertexAttribDivisor,它接受两个参数,第一个参数代表将要影响的顶点属性编号,第二个是绘制几个实例更新数据,一般指定为1。这样这个顶点属性只会在绘制新实例的时候更新(那几个顶点算一个实例?drawcall里就制定了)。达到了一个batch多次绘制的目的,并且顶点属性没有大小的限制。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值