每年總有那么幾個星期不想寫編譯器,這個時候做做ray tracing就變成一件很美妙的事情了。因此這個星期重寫了當年那個超爛的光線追蹤,然后加上了貼圖的功能。當然圖是可以直接貼在物體上的,還支持了法線貼圖,譬如說下面做的地球在不同方向的光線的照射下顯得有立體效果:
之所以FPS有16是因為我已經不再當年那個破thinkpad上渲染,而在一個i7四核超線程三通道的CPU上做了。渲染的時候為了簡單,把屏幕等分成了八行,然后創建八個線程分別綁定到八個CPU上面去(SetThreadAffinityMask),最后渲染完出來。當然比起那些專業的還是顯得相當慢,現在很多光線追蹤軟件都用了GPU來做,不過我GPU也沒用,SSE指令也沒用,就純粹C++寫。如今也懶得用C++做GUI了,所以把核心用C++做成了之后,export幾個函數出來,用C#的P/Invoke直接調用。C++渲染完以后給一個HBITMAP,C#拿過來就往窗口上畫,還是十分方便的哈。多語言開發萬歲。
重寫了光線追蹤之后仍然把折射和反射給做了,因此可以做出個類似凸透鏡一樣的東西:
需要提一下的是,做貼圖的時候實現了nearest、linear和bicubic三種插值方法。nearest基本上就是不插值,所以放大了之后會有馬賽克效果。linear是線性插值,如果放得太大還是能看出一點模糊的馬賽克。bicubic效果就好很多了,如果大家有興趣的話可以到
這里去看。為了達到更好的效果,后面還有計劃做ray differential和各向異性過濾。ray differential之后就可以做photon mapping(一種比較高效的全局光照模型)了。做完photon mapping之后,無聊的心情大概就結束了,可以繼續寫編譯器了吧。
嗯嗯,雖然ray differential和photon mapping還沒做,
我就先把代碼丟上啦,不僅可以做備份,大家也能搞下來看一看。當然需要有Visual Studio 2010才能編譯的。選擇release編譯之后到release文件夾下去啟動,debug的話慢的不能忍。而且我的多線程模型是一個核(超線程的話算兩個)一個線程,那些古老的雙核CPU大概性能會很慘不忍賭吧……
posted on 2011-01-08 23:54
陳梓瀚(vczh) 閱讀(6967)
評論(15) 編輯 收藏 引用 所屬分類:
3D