一個支持 RIB 和 RSL 的高速 raytracer,高速得可以近實時進行光線跟蹤。
經過了一年多的斷斷續續的開發,BloomingQuad 終于已經成型了,并能向一些實際應用性工作邁進,比如 Ambient Occlusion ,或者 RSL Shader。
其實我已經寫瘋了,所以現在我似乎都不知道應該寫什么來介紹它好。
然而,我剛剛畢業了,離開了舒服的學校,接下來必須面對吃飯問題。
所以、開門見山,我現在發布的 BloomingQuad 其實并不完善(應該說相當不完善),我 90% 是為了找工作才發布的,又或者說,希望能找到懂得它的作用和意義的合作伙伴。
很多人說我不切實際、又說我開發些沒有 P 用的東西,也有很多人不屑,我不在乎,因為只要這個世界上依然有一個人懂得下面這些東西是什么,那就已經足夠了。當然,還希望那個人能支持我繼續做下去。
Ambient Occlusion 演示。
把它作為商業用渲染器,在國內唯一有用武之地的就是為專業工作室定制特殊的渲染效果,又或是一些需要用到更開放的渲染技術的高端項目。簡而言之、就是作為 In house Renderer.
但也必須先講明白,開發和維護這么一個東西,是極其不容易的,在目前來說投入與產出可能不成正比,它的價值,必須在一段時間的積累后才能看到。 Pixar 開發的 PRMan 也不是一年半載就能為它渲染電影的,80 年的項目,到了 95 年才渲染出第一部動畫電影。
盡管這是一場持久戰,但若我們真想達到 Pixar 的高度,一味地研究別人開發出來的軟件和技術是徒勞的,鼻子將永遠被別人牽著走。
那么除了開發一個 PRMan 的替代品外,我也自認通過這個渲染器的開發,我已經對整個 RenderMan 體系有非常深入的了解,甚至對各種渲染器的工作體系和結構有了很深刻的認識。不僅僅是 RenderMan ,MentalRay 的 MI 架構也是我的重點研究部分,BloomingQuad 的前幾版所使用的 Scene Description 就是類 MI 的節點式結構。
不過后來我覺得 RenderMan 比 MentalRay 要流行得多,而直接使用 RIB 會更劃算,于是我開始把整個結構體系進行重寫,以 RI Spec 3.3 為標準,力求可以完全符合 RI Spec 3.3 ,希望能渲染出和 PRMan (在輪廓和基本要素上)一致的圖像。
當然這是非常艱難而痛苦的,特別是一個人、只能利用課余時間編寫。
為了達到能在實際渲染中使用,我把整個渲染器都使用了 SSE/SSE2 指令優化,尤其是 Raytrace 核心部分,全部用匯編寫成,速度“可以說”非常快,能達到(某一測試場景)1800 萬次/秒,約是 Pixie 的 2 倍。
而最后,為了找到商業使用的機會,我修改了一下內核,使它能實現簡單的 Realtime Raytrace,以直觀的方法表現它到底有多快。
Realtime ~ 這個場景比較少面,所以也能達到 7 fps 左右,320 X 240
400 X 300 的 realtime 演示,我絕對不會使用 Sphere、Box 這些直接簡化了 Intersection 的東西來自欺欺人,所有演示的物體都是 General 多邊形。

支持 RSL 的編譯與執行、上面的三個物體都分別使用了編寫的 Shader ,盒子用了 Slim 生成的 Worley ,平面用了 step( x , mod() ) 形式的 Grid ,球體利用 s 坐標混合了 Thead 和 Spline ( Noise( P ) )。
另外我也終于完成了持久的“抗戰”,寫出了一個 RenderMan Shading Language 編譯器與執行虛擬機。這個編譯器符合 RI Spec 3.3 標準,能成功編譯出 Slim 生成的各種 Shader ,而且支持 Constant Folding、Instruction Replacement、Dead Code Elimination 等優化。但目前它的光照部分(包括 Illumination 和 Illuminate 、Solar、Ambience)都在測試中,Gather 正在編寫,而 Occlusion 和 Indirect Diffuse 只能靠命令行激活。

相信有更多人(可能一共才只有幾個吧)會關心它到底怎么在 Max、Maya 、XSI 中使用,其實很簡單,RIB 非常流行,幾乎所有的大型軟件上都有導出 RIB 文件的軟件,MAX 有 maxman,Maya 有 RAT、mayaman、liquid,XSI 有 rib 插件,LW 有 Lightman,Houdini 本身直接支持,所以根本不需要擔心、所有的大型軟件都能和 BloomingQuad 進行溝通。
而且我能保證 MTOR 從 Maya 里導出的東西能大部分正確渲染。
大部分是指哪些部分呢?其實目前僅僅是指多邊形而已,而且最好是三角片面的多邊形,又或者保證“合法”的多邊形,若有重邊或者法線有問題,都不能渲染。
上面測試用的兩個人頭模型,都是我自己在 Maya 里做的,然后用 MTOR 導出來渲染的,可以看看它到底渲染出來的結果準確不準確。
如果你想直接在 Maya 里渲染 —— No problem ,在 RAT 里設置一下就 OK 了。

也可以在 Maya 里啟動實時 raytrace ~
說實在,這個 Realtime Raytrace 不太 Realtime,當然,我只是修改了一下 Render Loop 就拿出來了,里面的模型結構、Shading 體系,都是按照軟渲染設計的,和普通軟渲染共用同一個結構,沒有作任何的實時渲染優化,所以能跑出這個 fps ,我自己就覺得已經 OK 了。
為了要說明它是 Realtime 的,我還設計了幾個按鍵,i k l j , . 這六個,可以移動鏡頭,很簡陋的功能而已,當然可以做得更復雜一些,但我目前只是演示一下我能做到什么地步,而怎么再精益求精則是在我解決了工作問題之后再想的事情了。
那么基本上都講得 7788 了,開發過程還有很多有趣的東西,不過這只是很少數比較關心開發的人想要知道的。
其實這個所謂“渲染器”所能做到的還很有限,畢竟我只有一雙手、一個腦袋,但我所希望的是能通過它讓更多人看到,到底我們的開發能夠做到些什么出來。
并不是說,別人的軟件、所實現的功能,我們就一定絕對無法趕得上,這個說法是完全錯誤的。
問題在于,一直以來我們從來沒有怎么在這上面投入過,大部分人都在觀望,還有的在冷嘲熱諷。
對,可能還沒有這個市場、可能技術還不成熟,但必須有人去嘗試,必須有人出來承擔這個責任。
上面那些效果,在大部分人用商業渲染器看來,很幼稚。不過這僅僅是一個開始,我用一年時間做到了一個開始。
或許我最后還是要被迫放棄 CG 的工作,放棄我喜歡的開發,放棄我要超越 PRMan 的夢,但發這個帖子,除了為我自己找一個機會以外,更多的是希望大家在建模的時候、在 Rig 的時候、在 Surfacing 的時候、在 Key 動作的時候、在等待渲染的時候,能多想一想、什么時候我們能用我們自己的 CG 軟件去做這些事情。
下載:
rar 包 1 2
兩個文件解壓到任何一個文件夾都可以,如果想要在 Maya 里調用,就必須放到 RAT 能找到的目錄里,比如任何一個在 PATH 里的目錄。
注意!必須是支持 SSE2 指令集的機器(即 P4、PM、A64)才可以運行。
在命令行里輸入:
bqrd -rt occlusion.rib
即可進入 Realtime 測試。
bqrd -oc 32 king-triangle.rib
測試渲染 Ambient Occlusion,其中 -oc X 是指定采樣的數目。
而 rscl 是 RSL 的編譯器,懂 RenderMan 的朋友可以試一下自己寫 Shader 給 rscl 編譯,.shader 的文件是已經編譯好了的 Shader。
注意!illuminance、illuminate、gather 等 statement 目前仍不支持,所有的 Derivative 都有限度支持(不支持 Du() 與 Dv() ,dPdu 與 dPdv 的結果只能作為切線方向)。
其它都合符 RenderMan Interface Specification 3.3 。
p.s.
渲染完成后可以按 's' 快捷鍵把渲染結果儲存成 TIFF 格式的圖片。
渲染窗口中按 F1 可以看到其它快捷鍵表,可以顯示獨立通道、或者混合顯示 alpha 等等。