网上的描边实现大部分都是法线外扩、模板、后处理这种的,我想实现一个类似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;