1. 程式人生 > >shader中ddx/ddy偏導數的原理和簡單應用

shader中ddx/ddy偏導數的原理和簡單應用

最近發現一篇對shaderddxddy講解的比較清楚的一篇文章,這裡對其做個簡單的翻譯和總結。

偏導函式,分為HLSL:ddxddy, GLSL:dFdx,dFdy,分別對應 x,y軸上,在螢幕空間中,畫素塊中各種變數的變化率。

偏導數的計算:

看了下面的圖就可以更加清晰是怎麼一回事了:



我們知道在光柵化的時刻,GPUs會在同一時刻並行執行很多Fragment Shader,但是並不是一個pixel一個pixel去執行的,而是將其組織在2x2的一組pixels分塊中,去並行執行。而偏導數就正好是計算的這一塊畫素中的變化率。從上圖可以看出來ddx 就是右邊的畫素塊的值減去左邊畫素塊的值,而

ddy就是下面畫素塊的值減去上面畫素塊的值。其中的xy代表的是螢幕座標。

注意:偏導數ddx/y可以計算我們FragmentShader中任意的變數。向量,矩陣等等。

看看幾個偏導數的應用:

1.Mipmap:(對UV求偏導的應用)



大家應該都知道mipmap 的用處,但是可能並不知道mipmap的核心在選擇到底用那一塊mipmaplevel時,靠的就是偏導數。螢幕空間的貼圖UV偏導數過大的時候代表貼圖離我們過遠,就會選擇低等級的mipmap

2.Flat Shader(對頂點做偏導的應用)

通過對頂點的偏導數,就可以實現簡單的頂點作色效果。

而且不用頂點傳入法線,也能求出模型的法線,原理如下:

1.VertexShader,將頂點的Pos傳入到FragmentShader中;

2.FragShader中,我們如果呼叫ddx(Pos),ddy(Pos)這個代表求出相鄰的2個畫素塊之間座標的差值,即下面圖中的紅色和綠色2個向量,而這2個向量都在這個三角形的平面上,那麼執行 normalize( cross(ddx(pos),ddy(pos)) ) 就求出的面的法線,但是這裡要注意,在HlSL上面,或者Unity上面要寫成normalize( cross(ddy(pos),ddx(pos)) ),不然法線是反向的。這個是由於左右手座標系引起的。

 

效果如下:

 

Unity裡面顯示法線如下效果:

 void surf (Input IN, inout SurfaceOutput o)

{

o.Albedo = normalize(cross(ddy(IN.worldPos),ddx(IN.worldPos)));

}


3.貼圖勾邊銳化?(對貼圖顏色求偏導的例子)

Unity裡面測試

void surf (Input IN, inout SurfaceOutput o)

{

half4 c = tex2D(_MainTex, IN.uv_MainTex);

//c += ddx(c)*2 + ddy(c)*2;這行程式碼開啟和關閉的效果

o.Albedo = c.rgb;

o.Alpha = c.a;

}

 

左邊是直接顯示圖片,右邊是在圖片上面加上xy的偏導數。

不知道這個有沒有那個大俠做個這方面的應用哈,可以留言,大家一起學習學習:)

在原貼中,還講解了偏導數在GPU 處理條件語句的情況下的一些情況和2x2分塊的一些細節,大家可以原貼去看下哈。

相關推薦

shaderddx/ddy原理簡單應用

最近發現一篇對shader中ddx,ddy講解的比較清楚的一篇文章,這裡對其做個簡單的翻譯和總結。 偏導函式,分為HLSL:ddx和ddy, GLSL:dFdx,dFdy,分別對應 x,y軸上,在螢幕空間中,畫素塊中各種變數的變化率。 偏導數的計算: 看了下面的

WebGL 著色器dFdxdFdy介紹

本文適合對webgl、計算機圖形學、前端視覺化感興趣的讀者。 偏導數函式(HLSL中的ddx和ddy,GLSL中的dFdx和dFdy)是片元著色器中的一個用於計算任何變數基於螢幕空間座標的變化率的指令(函式)。在WebGL中,使用的是dFdx和dFdy,還有另外一個函式fwidth = dFdx + dF

記憶體檔案對映原理簡單應用

參考部落格:http://blog.csdn.net/haiross/article/details/46875211 參考部落格:http://blog.csdn.net/mg0832058/ar

jsbind、call、apply區別簡單應用

1,js函式應用的時候都包含著隱式傳遞this的效果--而bind、call、apply是顯式傳遞boj的效果; 2,顯式是為了和別的obj(上下文)發生關係,bind是指定關係,然後再某個時刻運用這種關係,call、apply是指定這種關係並且立即運用; 以下是例子: v

影象處理的一階二階

Laplace運算元和Sobel運算元一樣,屬於空間銳化濾波操作。起本質與前面的Spatial Filter操作大同小異,下面就通過Laplace運算元來介紹一下空間銳化濾波,並對OpenCV中提供的Laplacian函式進行一些說明。 數學原理 離散函式導數 離散函式的導數退化成了差分,一維一階差分公式

《FDTD electromagnetic field using MATLAB》讀書筆記之一階、二階差商近似

lec ges 讀書筆記 ctr 技術分享 分享 using alt net 《FDTD electromagnetic field using MATLAB》讀書筆記之一階、二階偏導數差商近似

有一個 class b- text 處的 變量 定義 art 微積分 導數(Derivative)是微積分中的重要基礎概念。當函數y=f(x)的自變量X在一點x0上產生一個增量Δx時,函數輸出值的增量Δy與自變量增量Δx的比值在&Delt

(轉)、方向、梯度、梯度下降

原作者:WangBo_NLPR 原文:https://blog.csdn.net/walilk/article/details/50978864 原作者:Eric_LH 原文:https://blog.csdn.net/eric_lh/article/details/789944

第四章 微分值定理及應用

一、羅爾定理1、幾何意義2、證明,閉區間可取得極值,最大值點處導數存在,左導數等於右導數,證明該點出導數只能等於零 二、拉格朗日定理1、幾何意義2、證明,作原函式與平行於曲線弦的一條直線的差,其端點值相等,則根據羅爾定理可證明3、拉格朗日定理的其他形式4、拉格朗日定理是羅爾定理的擴充套件5、任意點處的拉格朗

與全的關係 以及 微分與全微分的關係

1.偏導數 代數意義  偏導數是對一個變數求導,另一個變數當做數 對x求偏導的話y就看作一個數,描述的是x方向上的變化率 對y求偏導的話x就看作一個數,描述的是y方向上的變化率 幾何意義 對x求偏導是曲面z=f(x,y)在x方向上的切線 對y求偏導是曲面z=f(x,y)在x方向

第三章_微分值定理與應用

總習題三: 考察零點的個數主要是分析函式的單調性的問題,求出函式的駐點,看是極大值還是極小值然後帶入進行判斷零點的個數 有的時候代入法對於選擇題是非常高效和正確的     基本上都是使用洛

Softmax輸出層損失函式及

softmax輸出層(m個輸入,n個輸出): Z=WX+B Z = WX+B (其中W為係數矩陣( n×m n\times m),B為n維偏置量,X為m維輸入向量,Z為n維向量) yj=ezj∑mj=1ezj y_j

,全,方向微分,全微分,梯度

學習到機器學習線性迴歸和邏輯迴歸時遇到了梯度下降演算法,然後順著扯出了一堆高數的相關概念理論:導數、偏導數、全微分、方向導數、梯度,重新回顧它們之間的一些關係,從網上和教材中摘錄相關知識點。 這段是我的簡單總結,如果看不懂沒關係,先看下面的定義 通過函式的極限定義出導數

,方向與梯度的定義與聯絡

一、導數(derivative) 導數,是我們最早接觸的一元函式中定義的,可以在 xy 平面直角座標系中方便的觀察。當 Δx→0時,P0處的導數就是因變數y在x0處的變化率,反映因變數隨自變數變化的快慢;從幾何意義來講,函式在一點的導數值就是過這一點切線的斜率。

函式連續,函式可微,函式可存在,連續之間的關係

1、可導      即設y=f(x)是一個單變數函式, 如果y在x=x0處存在導數y′=f′(x),則稱y在x=x[0]處可導。      如果一個函式在x0處可導,那麼它一定在x0處是連續函式。 函式可導定義: (1)設f(x)在x0及其附近有定義,則當a趨向於0時,若

人工智慧新手入門——高篇(

偏導數: 偏導數就是對多元函式求導就叫偏導數: CBDmax 這裡我們介紹了多元函式偏導數的概念,之前導數其實就是斜率了,在這裡偏導數我們也可以把它想象成斜率,但是我們再求的過程中,需要固定一點要麼x要麼y,最後通過固定一個變數的值最後

機器學習數學基礎--

偏導 定義:一個多變數的函式的偏導數是它關於其中一個變數的導數,而保持其他變數恆定(相對於全導數,在其中所有變數都允許變化)。 數學表示:函式關於變數x的偏導數寫為或。偏導數符號是圓體字母,區別於全導數符號的正體。 由定義可求得: 幾何含義:偏導數f'x(x0,y0)

影象處理的一階與二階

http://www.cnblogs.com/dengdan890730/p/6145585.html一階導數與二階導數的計算影象I可以看作(x,y)∈N2→N的對映: i=f(x,y). 其中N為正整數.很明顯f在定義域上是不連續的.不連續函式f(x,y)的導數, 嚴格來說

leetcode初級連結串列之刪除連結串列的節點以及第N個節點

請編寫一個函式,使其可以刪除某個連結串列中給定的(非末尾)節點,你將只被給定要求被刪除的節點。 現有一個連結串列 – head = [4,5,1,9],它可以表示為: 4 -> 5 -> 1 -> 9 示例 1: 輸入: hea

梯度-lagrange乘子法-連續必然可微分

前言: 僅個人小記 前提 某點的梯度是一個向量,比如對於z=f(x,y)的點(x0,y0,z0)(x0,y0,z0)處的梯度為二維向量∇f(x0,y0)=(fx(x0,y0),fy(x0,y0))=fx(x0,y0)i⃗ +fy(x0,y0)j⃗ ∇f(