先说说使用场景吧。
假如场景中要做一颗有很多树叶的大树,那么可能会有两种做法。
每个树叶做成真实模型,使用非透明贴图
会导致面数极大的增加每个树叶做成一个片面,使用透明贴图
这会极大的减少面数
然后使用透明贴图, 又可以分成两种做法
- 使用AlphaBlend
就是普通的透明物体渲染,也会存在透明物体渲染的问题(交叉物体的透明渲染问题)
- 使用AlphaTest
将透明的像素剔除,只保留非透明的像素。不会出现交叉物体的透明渲染问题,但会造成性能问题(所有被其它物体遮挡,或者被自身遮挡的像素都会执行片元着色)
那么到底使用哪种方案比较好呢,先总结一下:
方案 | 缺点 |
---|---|
1. 非透明渲染 | 面数太多 |
2. AlphaBlend | 深度问题 |
3. AlphaBlend 写深度 | 多一个Pass |
4. AlphaTest | 所有像素都会执行片元着色 |
那么,对于大树这个需求,哪个方案比较合适呢?继续分析。
- 如果面数不会很多,那么方案1是最好的
- 如果交叉物体的透明渲染问题可以接受,那么方案2是透明贴图方案中最好的
- 方案3不太适用于树叶这个需求,因为树叶是一个面片,第一个Pas中写了深度会导致树叶透明部分会遮挡后面的树叶,而且多一个Pass。DrawCall翻倍。
- 方案4虽然使用了透明贴图,但实质上与非透明物体渲染一致(队列不同)。