24. DDX和DDY

目的
DDX DDY是什么?
DDX 和DDY有什么作用?
介紹 | 偏導(dǎo)函數(shù)
DDX 和DDY是做查找斜率的節(jié)點(diǎn),

在數(shù)學(xué)上:導(dǎo)數(shù)就是函數(shù)的變化率。幾何意義是固定面上一點(diǎn)的斜率。
查找斜率需要兩個(gè)數(shù)據(jù),從一個(gè)值減去另一個(gè)值就可以計(jì)算出之間的差距。
偏導(dǎo)數(shù)計(jì)算
我們知道在光柵化的時(shí)刻,GPUs會(huì)在同一時(shí)刻并行運(yùn)行很多Fragment Shader,但是并不是一個(gè)pixel一個(gè)pixel去執(zhí)行的,而是將其組織在2x2的一組pixels分塊中,去并行執(zhí)行。而偏導(dǎo)數(shù)就正好是計(jì)算的這一塊像素中的變化率。從上圖可以看出來(lái)ddx 就是右邊的像素塊的值減去左邊像素塊的值,而ddy就是下面像素塊的值減去上面像素塊的值。其中的x,y代表的是屏幕坐標(biāo)。
該值屬于以紅色突出顯示的 2×2 塊

ddx是右減左的差值
ddy是下減上的差值
注意:偏導(dǎo)數(shù)ddx/y可以計(jì)算我們FragmentShader中任意的變量。向量,矩陣等等。

驗(yàn)證
使用UV 執(zhí)行節(jié)點(diǎn),通過(guò)數(shù)值顯示

效果

黑白邊界是有0-1變化,因此使用DDX計(jì)算出一條垂直的直線。

示例:計(jì)算面的法線
面法線方向

我們使用DDX和DDY計(jì)算出全局空間中2個(gè)像素之間的坐標(biāo)差值,計(jì)算出2個(gè)向量,

在使用轉(zhuǎn)換轉(zhuǎn)換功能把世界空間下的法線轉(zhuǎn)換成切線空間下。

這樣效果就完成,實(shí)現(xiàn)了不平滑的效果。
示例:描邊效果

左邊緣和上邊緣是差值為正數(shù)的像素,右邊緣和下邊緣是差值為負(fù)數(shù)的像素,純色的區(qū)域差值為0,因此分別取絕對(duì)值后加一起,不為0的像素就是邊緣。
總結(jié)
DDX,DDY是偏導(dǎo)函數(shù),
DDX和DDY可以重建法線出現(xiàn)問(wèn)題。
資料
著色器導(dǎo)數(shù)函數(shù)簡(jiǎn)介|發(fā)條漿果 (aclockworkberry.com)
(51條消息) Unity Shader - ddx/ddy偏導(dǎo)函數(shù)測(cè)試,實(shí)現(xiàn):銳化、高度圖、Flat shading應(yīng)用、高度生成法線_Jave.Lin的博客-CSDN博客_ddx ddy unity