边缘检测的原理是利用一些边缘检测算子对图像进行卷积操作。

转载请注明出处:http://www.cnblogs.com/jietian331/p/7232707.html

例如:

代码如下:

 using UnityEngine;

 public class EdgeDetectRenderer : PostEffectRenderer
{
[SerializeField]
Color m_edgeColor; protected override void OnRenderImage(RenderTexture src, RenderTexture dest)
{
base.Mat.SetColor("_EdgeColor", m_edgeColor);
base.OnRenderImage(src, dest);
} protected override string ShaderName
{
get { return "Custom/Edge Detect"; }
}
}

EdgeDetectRenderer

shader如下:

 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

 Shader "Custom/Edge Detect"
{
Properties
{
_MainTex("Main Texture", 2D) = "white" {}
_EdgeColor("Edge Color", Color) = (,,,)
} SubShader
{
Pass
{
Cull Off
ZWrite Off
ZTest Always CGPROGRAM
#pragma vertex vert
#pragma fragment frag sampler2D _MainTex;
float4 _MainTex_TexelSize;
uniform fixed4 _EdgeColor; struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float4 pos : SV_POSITION;
half2 uv[] : TEXCOORD0;
}; v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv[] = v.uv + _MainTex_TexelSize.xy * half2(-, );
o.uv[] = v.uv + _MainTex_TexelSize.xy * half2(, );
o.uv[] = v.uv + _MainTex_TexelSize.xy * half2(, );
o.uv[] = v.uv + _MainTex_TexelSize.xy * half2(-, );
o.uv[] = v.uv + _MainTex_TexelSize.xy * half2(, );
o.uv[] = v.uv + _MainTex_TexelSize.xy * half2(, );
o.uv[] = v.uv + _MainTex_TexelSize.xy * half2(-, -);
o.uv[] = v.uv + _MainTex_TexelSize.xy * half2(, -);
o.uv[] = v.uv + _MainTex_TexelSize.xy * half2(, -);
return o;
} float luminance(float3 color)
{
return dot(fixed3(0.2125, 0.7154, 0.0721), color);
} half sober(half2 uvs[])
{
half gx[] = { -, , ,
-, , ,
-, , };
half gy[] = { -, -, -,
, , ,
, , }; float edgeX = ;
float edgeY = ; for(int i = ; i < ; i++)
{
fixed3 c = tex2D(_MainTex, uvs[i]).rgb;
float l = luminance(c);
edgeX += l * gx[i];
edgeY += l * gy[i];
} return abs(edgeX) + abs(edgeY);
} fixed4 frag(v2f i) : SV_TARGET
{
half edge = sober(i.uv);
fixed4 tex = tex2D(_MainTex, i.uv[]);
return lerp(tex, _EdgeColor, edge);
} ENDCG
}
} Fallback Off
}

效果如下:

 

Unity shader学习之屏幕后期处理效果之边缘检测的更多相关文章

  1. Unity shader学习之屏幕后期处理效果之高斯模糊

    高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加 ...

  2. Unity shader学习之屏幕后期处理效果之Bloom效果

    Bloom特效是游戏中常见的一种屏幕效果.这种特效可以模拟真实摄像机的一种图像效果,它让画面中较亮的区域“扩散”到周围的区域中,造成一种朦胧的效果. Bloom的实现原理很简单,首先根据一个阈值提取出 ...

  3. Unity shader学习之屏幕后期处理效果之运动模糊

    运动模糊,代码如下: using UnityEngine; public class MotionBlurRenderer : PostEffectRenderer { [Range(0.1f, 0. ...

  4. Unity shader学习之屏幕后期处理效果之均值模糊

    均值模糊,也使用卷积来实现,之不过卷积中每个值均相等,且相加等于1. 代码如下, 子类: using UnityEngine; public class MeanBlurRenderer : Post ...

  5. Unity shader学习之屏幕后期处理效果之高度雾,重建world pos方法2

    这里使用一种更高效地从深度纹理中重建世界坐标的方法. 首先计算摄像机的视锥体的四条射线向量进行线性插值,插值后的值便是该像素在世界空间坐标下到摄像机的方向. 然后通过与深度值相乘即可得到摄像机位置到该 ...

  6. Unity shader学习之屏幕后期效果之调整屏幕亮度,饱和度,对比度

    Unity的屏幕后期处理效果,使用MonoBehaviour.OnRenderImage来实现. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7228063 ...

  7. Unity Shader 学习之旅

    Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...

  8. Unity Shader 学习之旅之SurfaceShader

    Unity Shader 学习之旅之SurfaceShader unity shader 图形图像  如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...

  9. 第四章 开始Unity Shader学习之旅(3)

    1. 程序员的烦恼:Debug 调试(debug),大概是所有程序员的噩梦.而不幸的是,对一个Shader进行调试更是噩梦中的噩梦.这也是造成Shader难写的原因之一--如果发现得到的效果不对,我们 ...

随机推荐

  1. kvm qemu ,ubuntu debian rootfs 通过qemu复现路由器漏洞

    KVM https://www.toutiao.com/i6264303973256135170/?tt_from=weixin&utm_campaign=client_share&t ...

  2. [daily][dpdk] 内核模块(网卡驱动)无法卸载

    由于程序的异常退出, 内核的引用计数没有被清除(我猜的). 所以驱动不能被卸载掉, 强制也不行. 如下: [root@localhost ~]# insmod /opt/scorpion/KingKo ...

  3. 读书笔记iOS-Core-Animation-Advanced-Techniques,iOS性能调试工具

    调试卡顿,除了使用timer profile,还可以使用 OpenGL ES驱动工具 OpenGL ES Driver工具显示的GPU利用率,打开Color Blended Layers 我们给图片和 ...

  4. 机器学习:K-近邻算法

    K-近邻算法 优点:精度高.对异常值不敏感.无数据输入假定.缺点:计算复杂度高.空间复杂度高.使用数据范围:数值型和标称型. k-近邻算法的一般流程 搜集数据:可以使用任何方法.准备数据:距离计算所需 ...

  5. 【Python全栈-CSS】CSS入门

    CSS入门教程 参考: http://www.cnblogs.com/yuanchenqi/articles/5977825.html http://www.ruanyifeng.com/blog/2 ...

  6. winform接收全局的快捷键

    public class NativeWIN32 { public NativeWIN32() { } /* ------- using WIN32 Windows API in a C# appli ...

  7. 前端 HTML 常用标签 head标签相关内容 script标签

    script标签 定义JavaScript代码 <!--定义JavaScript代码--> <script type="text/javascript"> ...

  8. CentOS 下安装 Node.js 8.11.3 LTS Version

    Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google Chrome V8 JavaScript引擎,简单说是运行在服务端的 JavaScript.下面我们来演示一下Cen ...

  9. if __name__==__main__:的应用

    1. if __name__==__main__:代码的作用 python的文件有两种使用的方法:(1)直接作为脚本执行:(2)import到其他的python脚本中被调用(模块重用)执行: 因此if ...

  10. 照葫芦画瓢之爬虫豆瓣top100

    import requestsimport reimport jsonfrom requests.exceptions import RequestExceptiondef get(url):    ...