2 回答
![?](http://img1.sycdn.imooc.com/545861b80001d27c02200220-100-100.jpg)
TA贡献1851条经验 获得超3个赞
AFAIK,着色基本上是设置顶点颜色。这是为粒子完成的,您可以在其中设置随机开始颜色,并且所有粒子都在单个绘制调用中渲染。顶点颜色不会改变/创建新材质。
不确定在早期 Unity 版本中是如何处理的,但精灵应该是简单的四边形,因此支持顶点颜色。Sprite 着色器在着色方面的工作方式可能相同。
一般来说,你是对的。更改着色器属性将创建该材质的副本,或者它会更改材质本身并影响使用该材质的所有实例。你是在 sprite 材质上还是在 spriteRenderer 上使用了色调?
手动,我可以想到使用 MaterialPropertyBlocks,但也许 Unity 正是为精灵做到了这一点。
更多细节需要澄清:
A你有“Material01.mat”——它是绿色的。您将此材质复制到 10 个精灵。你想要10种颜色?您必须创建 10 个材质,每个材质都包含所需的颜色 - 10 个 Draw 调用。
您可以通过脚本执行相同的操作,只需更改 material.color。但是 Unity 会为您复制材料。还有 10 次 Draw 调用。有些人在听到这个消息之前对为什么它会中断批处理感到困惑。
B你改变了渲染器的色调。这个精灵渲染器将使用顶点颜色属性将色调颜色写入您的精灵顶点(可能是 4 个?)。它基本上是免费的,因为它们无论如何都会传输到 gpu (afaik)
正如我上面所说,在粒子系统中也使用了相同的方法,以允许具有 1 个 Drawcall 的彩虹粒子。
因此,任何粒子着色器、自写着色器或精灵着色器都应该与此配合使用。所有你需要的是a.albedo = c.rgb * IN.vert.color
(这里有点伪代码)
这意味着,相同的着色器和相同的材质可用于具有不同顶点颜色的多个对象。这不会破坏批处理。
你甚至可以有任何形状和顶点数的不同对象,给它们不同的顶点颜色(每个顶点,如渐变等),它仍然会批处理。
尽可能检查静态,将信息输入顶点颜色,对于移动对象,尽量将它们保持在 300 个顶点以下,以便动态批处理可以工作。
但是对于 Sprites,unity 会为您自动执行此操作,您只需要使用 SpriteRenderer - 这就是为什么您不使用带有纹理的四边形,而是使用“Sprite”和 SpriteRenderer。
同样,我可能是错的,SpriteRenderer 实际上使用 MaterialPropertyBlocks,但它的工作原理几乎相同。这些变量可以针对每个对象进行设置,并且不会创建新的 DrawCall。变量值在着色器中使用,因此多个对象的材质/着色器是相同的。
- 2 回答
- 0 关注
- 205 浏览
添加回答
举报