再谈边缘检测【Unity Shader入门精要13.4】

本文探讨了在Unity中如何利用Roberts算子进行深度和法线纹理上的边缘检测,以避免颜色信息的影响。通过计算对角方向的深度和法线差值,当超过预设阈值时识别边缘。这种方法适用于实现物体描边效果,通过重新渲染物体并应用边缘检测算法来达到目的。此外,还提及了Unity的着色器转换功能用于创建缓存纹理。
摘要由CSDN通过智能技术生成

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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值