外轮廓渲染方式
我这里所要介绍的外轮廓是使用模糊后处理实现的,不涉及到边缘查找或是顶点扩展这些,简单的说这种方式渲染外轮廓总共分三步:
1.用单色渲染目标物体到RT1上
2.对该RT1进行模糊处理得到RT2
3.将RT2中与RT1重合的像素抠掉,形成的外轮廓与原始图叠加,最终在原图上绘制出了目标物体的外轮廓。
这样绘制出的外轮廓形状比较均匀,薄厚易于调整(通过调整模糊程度),不会被遮挡住也可以同时作为被遮挡人形的渲染效果,之前玩儿风暴英雄感觉他的那个角色轮廓就是这么搞的。另外如果说不希望外轮廓透过遮挡物的话可以在第一步的时候使用Camera目标缓冲区的深度缓存,添加一点深度位移就可以保证RT1得到的只是目标物体未被遮挡的部分。
第二步与第三步都是简单的图像处理,在OnRenderImage消息响应方法中使用Unity3D提供的非常简便的Graphic.Blit接口就好了,我主要讲讲使用Unity5新提供的CommandBuffer对第一步的实现方法。
原来的做法
原来我做第一步的时候就是创建一个Camera,调用主摄像机的CopyFrom,修改一些设置再使用replacementShader来对目标物体进行单独的额外渲染,这有两点要求,一是目标物体有单独的layer,这样复制相机可以通过layermask对其进行筛选,第二就是针对该物体原有shader的RenderType写一个replacementShader。Camera的脚本如下:
[DisallowMultipleComponent]
[RequireComponent(typeof(Camera))]
public class CopyCamera : MonoBehaviour {
public LayerMask cullingMask;
public Shader replacementShader;
public Camera mainCamera;
protected virtual void Start()
{
if (!mainCamera)
mainCamera = Camera.main;
if (!mainCamera)
return;
Camera camera = GetComponent<Camera>();
transform.parent = mainCamera.transform;
transform.localPosition = Vector3.zero;
transform.localRotation = Quate