接下來幾篇主要圍繞卷積具體能在圖形渲染中實現什麼效果,比如常用的邊緣檢測濾波器(卷積濾波器),這個濾波器不僅在學習卷積的時候基本都會講到,而且我看過的國內外shader開發書籍中也都會提到,濾波器構成如下:
三維圖形學中邊緣的意義我們之前講過,不明白的可以回過去看下,這裡我們在來看下二維圖形中邊緣的意義。二維圖形中,因為圖形中畫素值的不同,會在連續畫素差異較大的地方讓我們肉眼形成一種邊界的視覺,同時邊界分為xy兩軸組成,所以我們需要xy兩個方向的濾波器進行卷積運算。
貼下xy兩個方向的濾波器(運算元)的數值矩陣,如下:
sobel濾波器
-1 0 1 -1 -2 -1
x = -2 0 2 y = 0 0 0
-1 0 1 1 2 1
首先我說下sobel卷積核心公式:這兩個運算元需要和當前畫素矩陣的亮度值做點乘,得到的xy軸兩方向的值(也稱梯度),計算其結合梯度值(g = sqrt(gx^2 + gy ^2);),然後將這個梯度值g作為主紋理顏色與邊緣顏色混合的權重值即可。
一般的亮度計算公式: y(亮度)=(0.299*r)+(0.587*g)+(0.114*b)
當然了還有如下:
這裡我們不用運算元去點乘rgb是因為y明亮度作為引數取梯度值更能準確表明連續畫素之間的差異。那麼對於xy軸兩個運算元,圖形數學敏感一些的話,看得出來x軸運算元處理的畫素矩陣,如果x正負方向上明亮度差異很大,就能產生乙個絕對值較大的梯度值,那麼我們就認為這就是「邊界」,y軸運算元同理。
接著就來shader實現,如下:
shader "unlit/edgesobelshader"
_edgecolor("edge color",color) = (1,1,1,1)
}subshader
lod 100
pass
;struct v2f
;sampler2d _maintex;
float4 _maintex_st;
float4 _maintex_texelsize;
float4 _edgecolor; /*邊緣顏色值*/
//rgb提取明亮度
//rgb轉yuv公式
float rgbtoy(fixed4 col)
fixed4 frag (v2f i) : sv_target
; /*x軸sobel運算元*/
float ysobel[9] = ; /*y軸sobel運算元*/
//xy軸梯度和結合梯度
float g = 0, gx = 0, gy = 0;
for (int k = 0; k < 9; k++)
//計算結合梯度
g = sqrt(gx*gx + gy*gy);
//主紋理取樣
fixed4 col = tex2d(_maintex, i.uv[4]);
//梯度混合
col = lerp(col, _edgecolor, g);
return col;
}endcg}}
}
順便看下效果,如下:
好了,之後會找一些其他的卷積濾波器來實現一些效果。
樹邊,前向邊,後向邊,橫叉邊
樹邊,前向邊,後向邊,橫叉邊,應該說,不是乙個圖本身有的概念,應該是圖進行dfs時才有的概念。圖進行dfs會得到一棵dfs樹 森林 在這個樹上才有了這些概念。對圖進行dfs,可以從任意的頂點開始,遍歷的方式也是多樣的,所以不同的遍歷會得到不同的dfs樹,進而產生不同的樹邊,前向邊,後向邊,橫叉邊。所...
邊學邊用LINUX
第一講 linux概述 第二講 linux的安裝過程 一 第三講 linux的安裝過程 二 第四講 linux的安裝過程 三 第五講 linux的安裝過程 四 第六講 x windows系統 第七講 kde的基本操作 第八講 linux作業系統中的中文環境 第九講 linux作業系統中的其它應用程式...
Python邊學邊用
由於要對10x10的節點設定靜態路由,如果手動寫真的太費事了。考慮使用程式設計實現。由於一直想學python,就藉機邊學邊用吧 python 是一種物件導向 直譯式計算機程式語言。它包含了一組完善而且容易理解的標準庫,能夠輕鬆完成很多常見的任務。它的語法簡捷和清晰,盡量使用無異義的英語單詞,與其它大...