先說(shuō)說(shuō)使用場(chǎng)景吧。
假如場(chǎng)景中要做一顆有很多樹葉的大樹,那么可能會(huì)有兩種做法。
每個(gè)樹葉做成真實(shí)模型,使用非透明貼圖
會(huì)導(dǎo)致面數(shù)極大的增加每個(gè)樹葉做成一個(gè)片面,使用透明貼圖
這會(huì)極大的減少面數(shù)
然后使用透明貼圖, 又可以分成兩種做法
- 使用AlphaBlend
就是普通的透明物體渲染,也會(huì)存在透明物體渲染的問題(交叉物體的透明渲染問題)
- 使用AlphaTest
將透明的像素剔除,只保留非透明的像素。不會(huì)出現(xiàn)交叉物體的透明渲染問題,但會(huì)造成性能問題(所有被其它物體遮擋,或者被自身遮擋的像素都會(huì)執(zhí)行片元著色)
那么到底使用哪種方案比較好呢,先總結(jié)一下:
| 方案 | 缺點(diǎn) |
|---|---|
| 1. 非透明渲染 | 面數(shù)太多 |
| 2. AlphaBlend | 深度問題 |
| 3. AlphaBlend 寫深度 | 多一個(gè)Pass |
| 4. AlphaTest | 所有像素都會(huì)執(zhí)行片元著色 |
那么,對(duì)于大樹這個(gè)需求,哪個(gè)方案比較合適呢?繼續(xù)分析。
- 如果面數(shù)不會(huì)很多,那么方案1是最好的
- 如果交叉物體的透明渲染問題可以接受,那么方案2是透明貼圖方案中最好的
- 方案3不太適用于樹葉這個(gè)需求,因?yàn)闃淙~是一個(gè)面片,第一個(gè)Pas中寫了深度會(huì)導(dǎo)致樹葉透明部分會(huì)遮擋后面的樹葉,而且多一個(gè)Pass。DrawCall翻倍。
- 方案4雖然使用了透明貼圖,但實(shí)質(zhì)上與非透明物體渲染一致(隊(duì)列不同)。