12.3节中的边缘检测使用的是Sobel算子,但是这种直接对颜色信息进行边缘检测的方法会产生很多我们不希望得到的边缘线,
本节学习如何在深度和法线纹理上进行边缘检测,这些图像不会受纹理和光照影响,而仅仅保存了当前渲染物体的模型信息。
Roberts算子的卷积核
-1 | 0 |
0 | 1 |
0 | -1 |
1 |
0 |
本质上是计算左上角和右下角的差值,乘以右上角和左下角的差值,作为评估边缘的依据,。
取对角方向的深度和法线值,比较他们之间的差值,如果超过某个阀值(可自由控制阀值),就认为他们之间存在一条边
//13.4 再谈边缘检测
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Unlit/Chapter13-EdgeDeterNormalAndDepth"
{
Properties{
_MainTex("Base (RGB)", 2D) = "white" {}
_EdgeOnly("Edge Only", Float) = 1.0
_EdgeColor("Edge Color", Color) = (0, 0, 0, 1)
_BackgroundColor("Background Color", Color) = (1, 1, 1, 1)
_SampleDistance("Sample Distance", Float) = 1.0//样本距离
_Sensitivity("Sensitivity", Vector) = (1, 1, 1, 1)//XY分量分别对应了法线和深度的检测灵敏度,ZW分量择没有实际作用
}
SubShader{
CGINCLUDE
#include "UnityCG.cginc"
sampler2D _MainTex;
half4 _MainTex_TexelSize;//存储纹素的大小
fixed _EdgeOnly;
fixed4 _EdgeColor;
fixed4 _BackgroundColor;
float _SampleDistance;
half4 _Sensitivity;
sampler2D _CameraDepth