原理
使用Roberts算子,计算左上角和右下角的差值,乘以右上角和左下角的差值,作为评估边缘的以具。
在具体实现中,取对角方向的深度或法线值,比较它们之间的差值,超过某个阈值就说明存在一条边.
脚本实现
using UnityEngine;
using System.Collections;
public class EdgeDetectNormalsAndDepth : PostEffectsBase
{
public Shader edgeDetectShader;
private Material edgeDetectMaterial = null;
public Material material
{
get
{
edgeDetectMaterial = CheckShaderAndCreateMaterial(edgeDetectShader, edgeDetectMaterial);
return edgeDetectMaterial;
}
}
[Range(0.0f, 1.0f)]
public float edgesOnly = 0.0f;
public Color edgeColor = Color.black;
public Color backgroundColor = Color.white;
public float sampleDistance = 1.0f;//采样距离 值越大描边越宽
public float sensitivityDepth = 1.0f;//深度灵敏度
public float sensitivityNormals = 1.0f;//法线灵敏度
void OnEnable()
{
GetComponent<Camera>().depthTextureMode |= DepthTextureMode.DepthNormals;
}
[ImageEffectOpaque]//只对渲染队列为Opaque的队列产生影响
void OnRenderImage(RenderTexture src, RenderTexture dest)