unity shader基于后处理的硬描边

       网上的描边实现大部分都是法线外扩、模板、后处理这种的,我想实现一个类似U3D编辑界面那种硬质描边,法线外扩的缺点大部分人都知道:遇到“硬边”,法线外扩就会造成描边断裂,非常影响美观。模板又要修改模型材质操作有点复杂。而后处理就挺简单修改模型的显示层单独渲染一遍就ok了,但是目前网上描边都做成了“自发光”,边不够“硬”,而且由于模型上需要绑碰撞,换层有点不“合理”;了解到CommandBuffer可以解决这个顾虑,需要操作的仅是把模型添加入CommandBuffer单独绘制即可,很满足我的需求,那就改一下吧。

        首先需要软描边(类自发光)的大佬可以参考这篇文章,我也是参考这个大佬改的:传送门

        具体操作是首先新建脚本OutLineCameraComponent.cs,拷贝上代码并挂载到主相机上。

/****************************************************
   文件:OutLineCameraComponent.cs
   名称:后处理描边相机组件
   说明:使用时需要将脚本挂载到三维模型相机上。主要参考文章:https://blog.youkuaiyun.com/vikingsc2007_1/article/details/76570931
   
   by--Sep
*****************************************************/
using System;
using UnityEngine;  
using System.Collections.Generic;
using UnityEngine.Rendering;  


// [ExecuteInEditMode]
public class OutLineCameraComponent : MonoBehaviour
{  
    private RenderTexture renderTexture = null;  
    private CommandBuffer commandBuffer = null;  
    
    private RenderTexture temp1 = null;  
    private RenderTexture temp2 = null;  

    [Header("单色shader")]
    public Shader preoutlineShader = null;  
   [Header("描边shader")]
     public Shader shader = null;

     private Material _preoutlineMaterial = null;
    private Material _material = null;
    public Color outLineColor;

    public Material mMaterial
    {
        get
        {
            if (_material == null)
            {
                _material = GenerateMaterial(shader);
                _material.SetColor("_OutlineColor", outLineColor);  
            }
            return _material;
        }
    }
    [Header("降分辨率,与描边宽度对应")]
    public int downSample = 2;  

    [Header("描边强度")]
    [Range(0.0f, 10.0f)]  
    public float outLineStrength = 3.0f;  

    //目标对象  
    private BaseModel targetModel;

    private void Awake()
    {
        _preoutlineMaterial = GenerateMaterial(preoutlineShader);
        _preoutlineMaterial.SetColor("_MainColor",outLineColor);
    }

    //根据shader创建用于屏幕特效的材质
    protected Material GenerateMaterial(Shader shader)
    {
        if (shader == null)
            return null;

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值