AlphaTest与AlphaBlend对比

先说说使用场景吧。
假如场景中要做一颗有很多树叶的大树,那么可能会有两种做法。

  • 每个树叶做成真实模型,使用非透明贴图
    会导致面数极大的增加

  • 每个树叶做成一个片面,使用透明贴图
    这会极大的减少面数

然后使用透明贴图, 又可以分成两种做法

  • 使用AlphaBlend
    就是普通的透明物体渲染,也会存在透明物体渲染的问题(交叉物体的透明渲染问题)

参见这里 http://www.jianshu.com/p/e953e937e210

  • 使用AlphaTest
    将透明的像素剔除,只保留非透明的像素。不会出现交叉物体的透明渲染问题,但会造成性能问题(所有被其它物体遮挡,或者被自身遮挡的像素都会执行片元着色)

参见文尾 http://www.jianshu.com/p/fa94dd910a1b

那么到底使用哪种方案比较好呢,先总结一下:

方案 缺点
1. 非透明渲染 面数太多
2. AlphaBlend 深度问题
3. AlphaBlend 写深度 多一个Pass
4. AlphaTest 所有像素都会执行片元着色

那么,对于大树这个需求,哪个方案比较合适呢?继续分析。

  • 如果面数不会很多,那么方案1是最好的
  • 如果交叉物体的透明渲染问题可以接受,那么方案2是透明贴图方案中最好的
  • 方案3不太适用于树叶这个需求,因为树叶是一个面片,第一个Pas中写了深度会导致树叶透明部分会遮挡后面的树叶,而且多一个Pass。DrawCall翻倍。
  • 方案4虽然使用了透明贴图,但实质上与非透明物体渲染一致(队列不同)。

你可能感兴趣的:(AlphaTest与AlphaBlend对比)