Soft Renderer的樂趣

最近這一個月的閒暇時間在邊學習《3D編程大師技巧》邊作本身的Soft Renderer,一個月下來總算有了個「基本原型」的樣子。主要是在編寫圖形管線的過程式代碼,簡單明瞭爲第一個階段的目標。html

 

今天加入了「透視校訂紋理映射」這個必不可少的圖形基本特性,計算公式摳自《Real-Time Rendering》2th的第十五章「透視校訂插值」一節的引用文章Blinn大拿的《W Pleasure W Fun》。即對UV紋理座標進行所謂的雙曲線插值。。。用起來卻是很簡單,大體意思就是:程序員

 

透視投影變換不是一個仿射變換,它會扭曲投影后的圖形,使得本來在eye space呈線性的z值在投影空間再也不線性,故而推出直接使用模型屬性(UV,頂點顏色等)來進行投影空間的線性插值是錯誤的。而投影空間z值根據推導對於1/z是線性的,因此只要根據u/z,v/z進行插值就正確了,這就是透視校訂紋理映射。編程

 

我思考了下,咱們在投影變換後的齊次除法這一步,將頂點座標x,y,z除以w,就能將頂點從投影空間變換到[-1,1]的CVV空間,最終的UDC座標是線性的。而根據OpenGL透視投影矩陣:性能優化

                          

可知,點(x,y,z,1)經變換後爲(x1,y1,z1,-z),即w=-z,因此齊次除法彷佛也是利用了關於1/z線性這個公式。這徹底是個人瞎推測,不對請高手指出。。。多線程

總結起來就是,透視投影變換不是一個仿射變換,而是讓變換後的點關於1/z呈線性的變換ide

 

 

下面是未進行透視校訂和進行了校訂的兩張對比圖:性能

 

3

 

4

 

Sponza場景的校訂和未校訂比較圖:學習

 

Sponza_Scene

 

2

 

只是使用Blinn大神在1998年給出的這個計算公式的話,是很簡單的,幾句代碼的事。釐清整個理論的數學推導就不那麼容易了。。。這也是Blinn大拿之因此稱爲大師的緣由。詳細數學推導我這裏上傳一份文檔,是大師的《Jim Blinn’s Corner:Notation,Notation,Notation》,在第十章《W Pleasure W Fun》中。沒什麼花哨的,跟往常同樣。。。大拿行雲流水的玩弄着數學公式,展現着數學圖表,我這個數學彩筆一如既往的痛不欲生。不過感受仍是比之前好些了,我弄明白了不少基本問題,如什麼是線性z,透視投影變換的更多細節等。不要浮躁,咱們須要的是端正的在鍵盤旁擺上一個艹搞本。。用直尺和鉛筆模仿大師的思路進行推導。。優化

 

Blinn's Corner.pdfspa

 

對於Blinn爺爺,高爺爺這樣的老學究,感受一個氣質啊,霸氣,隨性。出書都是無比霸氣的封面。。。。。以下(絕對沒有黑的意思!):

b

bb

 

作Soft Renderer頗有趣頗有收穫,我以爲這是圖形程序員都應該鍛鍊的一關。我這裏收集了一些可供參考的大牛前輩(你們一般都活躍於OpenGPU論壇)的軟渲做品,真的是各有千秋啊,也讓我有了前進的動力。

 

1.鬼火(Irrlicht)引擎的SoftRenderer和BurningVideo軟渲染器.前者是做者本身寫的,比較不完善,後者是愛好者加入的,更完善,因此稱爲"on steroids(打了雞血的渲染器)"...

2.空明大的軟渲染器salviar.
http://www.cppblog.com/lingjingqiu/archive/2009/12/07/102698.html

3.喬捷大的Hybrid3D軟渲染器,惋惜好像沒開源,不能學習精華.
http://www.cnblogs.com/Hybird3D/archive/2013/02/11/Rasterization_in_Hybird3D.html

4.易愷銘大的軟渲染器.
http://sr.codeplex.com/

5.姚勇大的軟渲染器.
http://www.cnblogs.com/puzzy3d/archive/2008/07/25/1251656.html

5.<<Real-Time Rendering>> + <<3D編程大師技巧>>. 理論與實踐的完美結合。。

 

update:

2013-8-7 :目前已完成Phong逐像素光照模型,光柵化實在已經感受吃不消了,幀數從Gouraund的10幾幀降到了1幀,果真是CPU計算密集型應用啊。。那 些還加入了法線貼圖,SSAO等高級效果的軟渲,本屌真心給跪了!。。。。如今開始進入第二階段:性能優化乃至管線優化,重點思考怎麼利用多核多線程甚至 SIMD來並行計算,來解決光柵化部分的太高瓶頸問題。

 

2013-8-19:加入多線程支持(線程池,生產者-消費者模型)。不過貌似加速比爲1啊。。。嗯,看來個人多線程有問題。

 

2013-11-9:加入了法線貼圖,效果一會兒讓我眼前一亮,果真要有法線貼圖人生才完整呢。。。。。

終於徹底理解了切空間的幾何意義:

p = ux * T + uy * B

一言以蔽之,這個等式的幾何意義就是把該點的UV(位於texture sapce)在object space線性表示出來~

推廣到座標系,故而TB就是texture space座標基(1,0)(0,1)在object space的表示,故而MatrixTBN是從texture space變換到object space。

之前總在疑惑,這個切空間爲何能夠把uv和position強扯上關係呢,如今明白了,這個地方咱們不要用局部的視角(即某點的uv,position)來看待,而要用總體的視角(texture space, object space),這也是矩陣的總體-局部思想的一個體現吧。

 

切空間的完善計算流程也是值得學習的,鬼火的作法貌似過期了。。。OGRE卻是與時俱進,參考下面兩篇文章:

http://www.terathon.com/code/tangent.html

http://www.sssa2000.com/?p=686

 

 

                         沒有法線貼圖

 

                   開啓法線貼圖

相關文章
相關標籤/搜索