回到20世紀90年代,PC上進入3D圖形硬體光柵化時代。VOODOO取代了CPU 光柵化渲染。隨後出現NVIDIA TNT。直到GEFORCE將3DFX吞併。現在GPU的演變已經8年,基於螢幕上每個象素的複雜計算已經可以讓老shader程式員忽略C和HLSL的區別。
在下一代mmo 3d引擎工具平台開發之前,有必要重新回到GPU內部,關注幾何與光柵管道。越來越複雜的shader效果一切均基於光柵器的運作機理。把工作從GPU搬回CPU目的為使圖形開發人員打撈圖形學基礎,在次世代開發中更好的運用GPU功能。
softcore 是一個軟體光柵器。用於從情境物體的geometry transform, clipping,lighting, texture mapping, gouraud shading,到最後光柵化顯示的整個圖形處理管道技術示範。此項目為了保持代碼清晰,省略了所有最佳化。只在可以使用SIMD和MULTITHREAD的步驟做出了標記。為了便於學習,project整合了id software doom3 sdk中SIMD和數學庫代碼。
由於是兩個星期業餘時間製作,時間有限,主要目的在於示範3D加速核心演算法,光柵化部分的tc,color數值計算和sampler部分仍然需要進一步tunning。需要去除溢出和浮點轉整數規則調整。這些可由感興趣人員自行修改。
softcore project
done:
* CPU soft rasterization
* Z-buffer
* Gouraud Shading
* Perspective Correct Texturemapping
* Near plane Clipping
* Back face culling(geometry)
* Directional lighting
not do:
x Phong shading/bump mapping
x Bilinear filter
x Mipmap
x Dynamic lightmap
x Vertex color export/import
x Optimization
以下是3DSMAX中情境原圖。有了硬體BILINEAR效果還是不一樣.....
多數初學者往往陷入3D API細節。認為繪製帶有各種效果的三角形就是在做引擎。或者疲於把各種NV SDK或者D3D SDK的sample code加入自己的工程。當然,用orge3d這樣的開源渲染器也可以做出《天龍八部》,《巨人》等商業產品,不過,想快速開發符合要求的次世代渲染器,需要大量實際工程方面的工作。針對範圍很狹窄的渲染器而言,對渲染效果品質的調整,以及自行開發美術需要的效果,不是照抄fx composer或者render monkey那麼簡單。由於對GPU工作原理認識不深,對某些效果最佳化實現背後的理論基礎認識不深,都會直接帶來在實際工程中開發的障礙。或者導致品質下降。
按說做為圖形程式員應該對3D光柵渲染的整條流水線做到倒背如流。不過3D硬體廠商加速了應用的進程。使得在螢幕上繪製三角形這件工作變得容易。也許會忽略人們對即時三維渲染的系統知識體系建立。在進階圖形渲染逐漸進入更複雜光照,全域光,基於物理或類比基於物理的技術層面之後,不對GPU工作機理做到透徹瞭解,在工作中會舉步為艱。因為所有渲染工作逐漸移到GPU寄存器中用可程式化代碼進行。整條管道,從Geometry transform,clipping,vertex lighting,到pixel的shading都由程式員控制。但GPU仍然自動進行了screen space的一些工作。包括clipping,掃描線線性插值,texture sampler等。這是光柵器能夠數百倍快於raytracing渲染的本質。但如果圖形程式員不瞭解被GPU自動進行的工作,也會象C++程式員不瞭解預設建構函式一樣盲目。
舉例,眾所周知普通的shadowmap 完全不具備工程實用性。最重要的是因為出於記憶體限制,shadowmap texture尺寸不可能滿足實際渲染精度需要。並且收到三角形在camera space中斜率影響巨大。Depth Bias問題的本質是什麼。與何參數相關。目前採用的各種調節depthmap渲染精度的方法背後理論依據是什麼。Perspective shadowmap,light space shadowmap等各自最佳化方法會遇到什麼問題,各自優缺點,以及工程中如何tunning,尤其用於self-shadow的問題。基於PCF(percentage closer filter)的各種軟陰影演算法的應用。
在對bumpmap技術改進過程中,在tangent space使用ray-tracing的reliefmap以及relaxed cone stepping relief map,以及帶有凹凸輪廓的releif map技術。以及parallax map,和其變種dynamic parallax occlusion map。如何在pixel層級用bilinear gouraud 和這些象素層級lighting進行LOD,如何改進parallax map隨視角變化而產生紋理浮動的問題,如何調整線性迭代和2分尋找對效率和效果的影響。甚至從本質上瞭解tangent space,phong shading,都要從軟體光柵機理開始。