今天把原来工作中实现的描边功能又看了下,发现有不少细节都忘记了,重新分析了下了过程,整理了下实现思路。
总的来说到描边功能实现了如下效果
1、宽度可控,且宽度不随物体缩放
2、可透明过度
3、可多个物体同时描边
4、不同物体的描边颜色可控
最终效果图:
下面是实现思路
1、在正常的场景渲染时通过StencileBuffer,标记描边物体像素
2、在描边渲染中,用StencileBuffer配合,重新用描边颜色渲染该对象,得到一个该物体可见部分的纯色图
3、对上图进行Blur处理,Blur可以使绿色部分范围往外延伸,延伸出来的部分就是描边,宽度和透明度也在这步控制
4、为了得到Blur延伸多出部分必须把物体自身部分去掉,需要对物体再次渲染,得到一个mask图像
5、用Blur后的图像和mask图像配合,将描边部分混合到BackBuffer
总结
1、描边过程需要在场景正常渲染时使用StencileBuffer,所以如果场景正常渲染已经使用了StencileBuffer则需要考虑其他方式,比如用MRT记录,对资源占用和方便性都没有StencileBuffer好。
2、整个过程中需要对描边物体进行两次额外渲染,且使用描边专用shader,集成难度视渲染架构而定,一般来说不会同时绘制很多描边物体,且描边shader本身很简单,所以额外的渲染次数对性能影响不大,另外Blur和描边混合到BackBuffer还需要数次全屏2D的操作,涉及的shader也很简单,性能影响也可以忽略。
3、资源占用上,需要得到两张全屏贴图和一个RT