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

转载请注明出处: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. Mac上安装使用MYSQL以及Navicat数据库管理和PHP服务器配置

    1.Apache服务器   Mac OS X内置Apache服务器,但默认没有启动 查看Apache版本: sudo apachectl -v 启动.关闭.重启Apache: sudo apachec ...

  2. Coding 小技巧

    </pre>//格式化字符串的传递<p></p><p>#define  FSKILL_LOG(format ,...)   DREAMLAND_RUNI ...

  3. Java之旅_高级教程_实例_文件操作

    1.文件写入 import java.io.*; public class MainClass{ public static void main(String[] args){ try{ Buffer ...

  4. falsk 与 django 捕获异常

    falsk捕获异常@app.errorhandler(405)def internal_server_error(e): return '这个接口不能被GET请求到,只能post' django 捕获 ...

  5. spring.schemas和spring.handlers对xmlns配置文件作用

    在很多情况下,我们需要为系统提供可配置化支持,简单的做法可以直接基于Spring的标准Bean来配置,但配置较为复杂或者需要更多丰富控制的 时候,会显得非常笨拙.一般的做法会用原生态的方式去解析定义好 ...

  6. java 线程(七)等待与唤醒

    package cn.sasa.demo5; public class Resources { private String name; private boolean gender; //标记 pu ...

  7. mvc,EntityFramework调用分页存储过程

    此文讲述mvc4+entityframework6+sqlserver2008环境下调用存储过程,实现分页. 1.分页存储过程代码如下: 分页原理用的row_number()和over()函数实现(没 ...

  8. MTU 和 MSS 关系、 IP分片、TCP分段

    从四层模型:链路层,网络层,传输层,应用层说 一 .以太网V2格式数据帧 : 链路层 Destination   Source  Type  DataAndPad  FCS 6            ...

  9. private static final Logger logger= LoggerFactory.getLogger(WhMainBusi.class);

    LoggerFactory.getLogger(WhMainBusi.class):指定类初始化日志对象,在日志输出的时候,将会打印日志信息所在的类.如: logger.info("日志信息 ...

  10. SSLv3存在严重设计缺陷漏洞(CVE-2014-3566)

    SSLv3存在严重设计缺陷漏洞(CVE-2014-3566) 1.引发问题的原因 SSLv3漏洞(CVE-2014-3566),该漏洞贯穿于所有的SSLv3版本中,利用该漏洞,黑客可以通过中间人攻击等 ...