關於dFdx/dFdy的實現

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
參考:https://stackoverflow.com/questions/28246413/understanding-the-basics-of-dfdx-and-dfdy
參考:https://zhuanlan.zhihu.com/p/113360369
參考:https://blog.csdn.net/ljytower/article/details/83024517

1. GPU並行計算

我們經常聽說shader中,儘量減少分支語句;
原因是:
if-else分支語句在執行時,實際各if-else中的操作都會被執行的,只是基於判定,有的被短路掉,不執行/不記錄,但執行時間消耗都是要等待的。
深層次的原因是:
GPU的實現上,使用SIMT-單指令多線程,實現的並行執行;執行的步驟指令是同步進行並往下執行的,就像一排軍人走正步一樣,step by step,一步一步向下執行;遇到分支語句時,有的走到分支中,有的不走到分支中;不走到分支中的也需要等待這一步的執行,從而保持步調一致。
(這塊可以參見參考文檔中描述)

2. 關於dFdx/dFdy

dFdx/dFdy我們經常稱它爲偏導,它的實現較強的依賴了GPU的SIMT工作方式。

  1. 在fragment shader中,在一個批次並行計算時,這個批次如果調用dFdx/dFdy(param)時,所對應的像素點都執行了該操作,傳遞了參數param;下一步收集到這些傳入的參數,然後計算與該像素點相鄰像素點之間傳遞的參數的差值就將做爲這個函數的返回。

  2. 導數的定義是:函數y = f(x),導數y’ = dy/dx,這裏的x向指像素位置,y指向傳入的參數,dx表達像素位置變化量,dy表達傳入參數變化量,則批次執行過程中:
    rt = dFdx(value)/dFdy(value) 調用將形成-形如這樣例子的調用關係:
    x(100, 100) -> param y(value1)
    x(100, 101) -> param y(value2)
    x(101, 100) -> param y(value3)
    x(101, 101) -> param y(value4)
    dFdx(value1)將返回, (value3-value1)/(101-100),即rt = value3-value1
    dFdy(value1)將返回, (value2-value1)/(101-100),即rt = value2-value1

以上就是對dFdx/dFdy實現的初步理解,如有理解不對的地方歡迎評論指出。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章