基于Unity實現(xiàn)2D邊緣檢測_第1頁
基于Unity實現(xiàn)2D邊緣檢測_第2頁
基于Unity實現(xiàn)2D邊緣檢測_第3頁
基于Unity實現(xiàn)2D邊緣檢測_第4頁
基于Unity實現(xiàn)2D邊緣檢測_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第基于Unity實現(xiàn)2D邊緣檢測目錄一、ShaderLab1.Alpha值邊緣檢測2.卷積邊緣檢測二、ShaderGraph

一、ShaderLab

1.Alpha值邊緣檢測

根據(jù)圖片的Alpha值邊緣判定,向內(nèi)擴一段距離做邊緣,顏色設置未描邊顏色;

片元著色階段,向上下左右四個方向做檢測,有一個點的透明度為0,判定為邊緣;

Shader"2DOutline"

Properties

_MainTex("Texture",2D)="white"{}

_LineWidth("Width",Range(0,0.4))=1.0

_LineColor("LineColor",color)=(1,1,1,1)

_Intensity("Intensity",Range(1,10))=1.0

SubShader

Tags{"RenderType"="Opaque""Queue"="Transparent"}

BlendSrcAlphaOneMinusSrcAlpha

Pass

CGPROGRAM

#pragmavertexvert

#pragmafragmentfrag

#include"UnityCG.cginc"

structappdata

float4vertex:POSITION;

float2uv:TEXCOORD0;

structv2f

float2uv:TEXCOORD0;

float4vertex:SV_POSITION;

sampler2D_MainTex;

float4_MainTex_ST;

fixed_LineWidth;

float4_LineColor;

fixed_Intensity;

v2fvert(appdatav)

v2fo;

o.vertex=UnityObjectToClipPos(v.vertex);

o.uv=TRANSFORM_TEX(v.uv,_MainTex);

returno;

fixed4frag(v2fi):SV_Target

fixed4col=tex2D(_MainTex,i.uv);

//采樣周圍4個點

float2up_uv=i.uv+float2(0,1)*_LineWidth*1/10*_MainTex_ST.xy;

float2down_uv=i.uv+float2(0,-1)*_LineWidth*1/10*_MainTex_ST.xy;

float2left_uv=i.uv+float2(-1,0)*_LineWidth*1/10*_MainTex_ST.xy;

float2right_uv=i.uv+float2(1,0)*_LineWidth*1/10*_MainTex_ST.xy;

//如果有一個點透明度為0說明是邊緣

floatw=tex2D(_MainTex,up_uv).a*tex2D(_MainTex,down_uv).a*tex2D(_MainTex,left_uv).a*tex2D(_MainTex,right_uv).a;

if(w==0){

col.rgb=lerp(_LineColor*_Intensity,col.rgb,w);

returncol;

ENDCG

如果圖片內(nèi)容恰好鋪滿整張圖,沒有alpha值,方法不適用;下圖底部邊緣消失了;

2.卷積邊緣檢測

在屏幕后處理階段,使用卷積做邊緣檢測;

卷積:根據(jù)像素周圍八個方向的像素的計算出新的像素值;

邊緣檢測卷積算子,都包含水平和豎直兩個方向的卷積核;

梯度公式:G=sqrt(Gx*Gx+Gy*Gy);

考慮性能問題,使用:G=|Gx|+|Gy|;

頂點著色器計算卷積紋理采樣坐標,減少計算量(片元數(shù)量更多);

片元著色階段Sobel卷積計算,插值獲得片元像素顏色;

Sobel計算結果和梯度Gradient比較,大于梯度和EdgeColor做插值;

屏幕后效調(diào)用OnRenderImage接口;

Shader"EdgeDetection"

Properties{

_MainTex("Base(RGB)",2D)="white"{}

_EdgeColor("EdgeColor",Color)=(0,0,0,1)

//卷積梯度

_Gradient("Gradient",float)=0.0

SubShader{

Pass

ZTestAlwaysCullOffZWriteOff

CGPROGRAM

#include"UnityCG.cginc"

#pragmavertexvert

#pragmafragmentfrag

sampler2D_MainTex;

uniformhalf4_MainTex_TexelSize;

//fixed_EdgeOnly;

fixed4_EdgeColor;

//fixed4_BackgroundColor;

fixed_Gradient;

structv2f{

float4pos:SV_POSITION;

half2uv[9]:TEXCOORD0;

v2fvert(appdata_imgv){

v2fo;

o.pos=UnityObjectToClipPos(v.vertex);

half2uv=v.texcoord;

o.uv[0]=uv+_MainTex_TexelSize.xy*half2(-1,-1);

o.uv[1]=uv+_MainTex_TexelSize.xy*half2(0,-1);

o.uv[2]=uv+_MainTex_TexelSize.xy*half2(1,-1);

o.uv[3]=uv+_MainTex_TexelSize.xy*half2(-1,0);

o.uv[4]=uv+_MainTex_TexelSize.xy*half2(0,0);

o.uv[5]=uv+_MainTex_TexelSize.xy*half2(1,0);

o.uv[6]=uv+_MainTex_TexelSize.xy*half2(-1,1);

o.uv[7]=uv+_MainTex_TexelSize.xy*half2(0,1);

o.uv[8]=uv+_MainTex_TexelSize.xy*half2(1,1);

returno;

fixedluminance(fixed4color){

return0.2125*color.r+0.7154*color.g+0.0721*color.b;

halfSobel(v2fi){

consthalfGx[9]={-1,0,1,

-2,0,2,

-1,0,1};

consthalfGy[9]={-1,-2,-1,

0,0,0,

1,2,1};

halftexColor;

halfedgeX=0;

halfedgeY=0;

for(intit=0;itit++){

texColor=luminance(tex2D(_MainTex,i.uv[it]));

edgeX+=texColor*Gx[it];

edgeY+=texColor*Gy[it];

halfedge=1-abs(edgeX)-abs(edgeY);

returnedge;

fixed4frag(v2fi):SV_Target{

halfedge=Sobel(i);

fixed4col=tex2D(_MainTex,i.uv[4]);

if(edge_Gradient)

col=lerp(_EdgeColor,tex2D(_MainTex,i.uv[4]),edge);

returncol;

ENDCG

FallBackOff

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論