您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何在Unity中實現基于筆觸的實時渲染,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
基于筆觸的渲染(stroke-based rendering,下稱SBR),簡單的講就是根據圖像生成筆觸,然后再用筆觸對圖像進行重繪。這個過程實際上是模仿畫家實際畫畫的過程,也就是觀察->理解->表達的過程,畫畫的時候有一句話叫意在筆先也就是這個意思。具體可以看這篇關于SBR的綜述:luthuli.cs.uiuc.edu/~da (luthuli.cs.uiuc.edu/~daf/courses/ComputerGraphics/01210867.pdf)。
研究生的時候我是研究非真實性渲染(Non-Photorealistic Rendering,下稱NPR)的,發現本質上有兩種方法,一種是基于經驗的研究方法,也就是沒有理論根據,根據實驗結果來設計渲染方法。好像有個圖形學大佬說過:看起來是對的,就是對的。大概說的就是基于經驗的研究方法。還有一種是基于物理模擬的研究方法,比如研究顏料的實際混色和水分的流動等等。
我發現基于經驗的方法有點憑感覺,無論是設計算法還是評判結果都不好弄。基于物理模擬的研究方法又是太笨重,只是在計算機中再現了工具和顏料,而怎么畫還是靠藝術家手工去畫。于是我在想,怎么讓計算機真的像藝術家一樣去思考,去表達呢。
剛好以前接觸過一點計算機視覺,于是在想有沒有一種基于視覺的研究方法,讓計算機去理解圖像,然后像人一樣去畫,也就是渲染,而不是用一堆濾波器。
那時候用了opencv去做圖像分割,然后計算圖像的顯著度(saliency),再根據顯著度生成筆刷,最后用cuda并行地渲染筆刷,做了這樣一個離線版本的SBR。效果還不錯,但是工作之后這個研究就放下了。
最近開始學習Unity的Compute Shader,發現跟cuda很像,于是又想起了SBR,感覺用Unity可以在后處理中實現的SBR,于是做了一些嘗試。
所有處理都寫在post processing stack的render里面,流程大概如下:
其中梯度張量的經過高斯平滑后,稱為平滑化梯度張量,求法如下:
IGa為高斯濾波的卷積運算,px為sobel算子計算的x方向的梯度,py為sobel算子計算的y方向的梯度。至于為什么用SVD分解求得的第二特征向量來計算旋轉矩陣,那是因為第一特征向量(主特征向量)表明的是變化最大的朝向,而第二特征向量與之正交,所以可以用來表明筆觸的流向。
左邊為原幀,右邊為SBR渲染后的效果:
基于筆觸的實時渲染
另外,筆觸的間隔和的大小可以調節出不同的效果:
筆觸的間隔和的大小可以調節
不同筆觸紋理可以有不同的渲染效果:
(github.com/alpacasking/SBR)
時間有限,現在只寫了最基本的流程,其實還有很多東西值得做,比如:
根據深度紋理檢測前景和背景,從而生成不同密度和大小的筆觸
利用CV相關知識分析理解圖像再生成筆觸
同時用不同的筆觸紋理渲染
讓每幀之間的筆觸銜接得流暢
可以為油畫,水彩風格等做進一步的研究
有時間的話會慢慢加上的,各位有興趣的話也可以自行魔改。
關于如何在Unity中實現基于筆觸的實時渲染就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。