最近做了一个URP管线的场景,又一次做到了树,遇到了多年以前遇到的问题,于是觉得非常有必要记录一下,说不定过两年还会遇到。
树的常规做法并没有什么区别,Speed Tree里都是常规制作,该烘球形法线的还是要烘。
此时导入urp管线下的场景里,赋予没有特殊处理的材质,表现如下。
看起来很平,缺乏层次,没有体积感。其实有经验的人一眼就看出来了,就是缺少AO。然而树干的贴图是tilling的,树叶的贴图是公用的,怎样给这样一颗树上AO呢。
之前在B站看到一个up看到一个解决方案,他的效果如下,可以看出效果要比不做任何处理的表现好太多。
具体实现方式是他在shader中做了一个探针,检测每个像素距离这个探针的距离,乘以一个深色,以达到树叶内部颜色深,外部颜色浅的效果。然后把这个探针移到这坨树的中间。
然而他这个方式有局限性,遇到异形的树,比如迎客松这种的,那他这个探针就不知道摆哪里了。
多年以前我在做一个项目的时候遇到过同样问题,我当初给出的解决方案是直接把AO烘到顶点色的一个通道上。但现在这么多年过去了,硬件的提升日新月异,把AO烘到一张图上已经不是个什么事了。于是在这次的项目中,我对树木AO的表现方式进行了一点升级。
首先2U是必须的,AO必须有个载体。然后把分好2U的模型导入到sp里,烘如下三张图。
得到的结果如下。
可以看到还是有些混乱,于是需要再进一步处理。可以处理的对比强烈一些,因为之后shader可以根据效果进一步处理。
引擎里的处理非常简单,就是乘一下。
用上刚才制作的贴图,调整一下,层次就出来了。
放上前后对比图。
最后,刚才那张图不用很大,256足以,真正的花小钱办大事。