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

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

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

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