Unity3D使用RenderCommand渲染外轮廓

本文介绍了如何使用Unity3D的RenderCommand来渲染外轮廓,避免了额外创建摄像机的开销。通过创建CommandBuffer,设置渲染任务,包括Clear、Draw Mesh等操作,实现了目标物体的单色渲染到RenderTexture上,进而完成外轮廓的模糊处理和叠加。这种方法相比传统方式更加高效且灵活。
摘要由CSDN通过智能技术生成

外轮廓渲染方式

我这里所要介绍的外轮廓是使用模糊后处理实现的,不涉及到边缘查找或是顶点扩展这些,简单的说这种方式渲染外轮廓总共分三步:
原始图片
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
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值