圖形基礎-潘多拉之盒

前言

現實中,光照射到物體上,物體反射光進入人眼,形成顏色,組合成視覺效果,相機模擬這一過程,圖形亦然。圖形渲染根據3d場景生成2d圖像,圖像盡可能模擬自然,盡可能真實。

渲染有兩種方式,射線追蹤和光柵化,前者更接近自然規則,實現簡單效果好,不過計算量大,廣泛應用電影CG等離線渲染,后者效率高,實現自然效果比較麻煩,同時GPU硬件支持,廣泛應用游戲等實時渲染。

簡介

計算機圖形,通過計算機模擬3d世界,并最終通過2d屏幕展示。主要包括Modeling/Rendering/Animation。

Modeling,通過數學方式建立3d幾何數據。可以通過3dMax、Blender等建模軟件,也可以通過數學公式表達。

Rendering,接受3d幾何數據,最終顯示在2d屏幕上,常見有光柵化和射線追蹤。

Animation,間隔一定時間變換屏幕顯示,造成動畫錯覺。

這里主要是介紹Rendering即渲染,模型和動畫會在后續3ds Max詳解。

數學

數學是一切自然科學的基石,圖形學大量使用數學知識。

坐標系

為了描述位置、方向等信息,需要選擇一個度量的參考點,這個就是坐標系,常見的有笛卡爾坐標系,用互相垂直的軸作為原點參考。2d的有x和y軸,3d的有xyz三個互相垂直的軸,常見的有左手坐標系和右手坐標系,dx采用左手坐標系,opengl采用右手坐標系。計算機的顯示屏幕,本質上是一個橫豎布局的畫布,左上角為原點,向下為正,y軸依次增加,向左為正,x軸依次增加。手機屏幕1920 x 1080,橫向x軸1920個像素,y軸1080個像素,最終手機渲染的圖像會顯示在這個像素區域。

向量和矩陣

向量用來表達幾何數據,矩陣用來變換向量。向量用來表達3d空間的位置、方向、法線等等幾何數據,向量常見的運算有,求長、歸一、相乘、點積和叉積等等,有良好的數學和幾何屬性,用來表達基礎幾何數據。矩陣的初衷用來解決數學函數的求解,有良好的數學表達能力,被發覺用來做變量變換。矩陣常見的運算有、相乘、轉置、求反等等。向量常見的三種變化移動、縮放和旋轉,3d向量坐標系轉換、轉換成2d并最終轉換成屏幕空間的2d像素等等,用矩陣都可以很好很高效的實現。

幾何

使用數據來表達3d世界,可以使用網格(Mesh),也可以使用數學公式,前者是渲染和很多操作的基石,后者也用于很多地方的計算。一個圓形,既可以用mesh,很多三角形來模擬,也可以使用數學公式,(x-x0) * (x - x0) + (y - y0) * (y - y0) = r * r來表達。比如在引擎中導入模型,基礎的mesh數據外面往往帶有包圍盒或者包圍球,渲染的時候,首先判定包圍盒或球是否在視錐體,如果在進行后續流程,不在的話,直接剔除,這個叫做攝像機剔除,大大提高場景渲染效率。射線相交的時候,首先判定射線是否和包圍盒或者包圍球相交,如果相交,進行后續步驟,大大提高相交效率。

兩者都有大量運用,這里主要是講Mesh。網格主要包括點(Vector),線(Egde)和面(Face)。面有很多拓撲單元,使用比較多的三角形,三角關系比較穩定,三角組成了最簡單的面,沒有歧義,適用于大量數學運算并且被GPU支持,效率非常高。

渲染

根據3d場景生成2d圖像,并在屏幕上顯示,圖像可以是真實感的,也可以是非真實感的,前者需要模擬大自然的模擬現象。

渲染流程的話,大概如下3d場景->渲染過程->顯示屏幕

1,顯示屏幕,本質橫向和縱向的像素畫布,連續的量轉換成離散的量會出現鋸齒,減少鋸齒的話,有三個方面,加大屏幕分辨率,抗鋸齒算法和動畫

2,3d場景,主要包括Model,Camera和Light,Model的話,可以使用網格來表示,也可以數學方式來表達。

3,渲染過程,渲染主要包括兩個階段,透視和著色。

人眼看自然世界,遠處看起來更小,秋水共長天一色,遠處的山和水竟然連在一起啦!這個是透視現象,照相機和圖形渲染時候,都采用相同原理。人眼看到各種顏色主要是有光,光通過各種反射折射等等最終傳播到人眼形成顏色,這個過程稱為著色。

渲染過程

3.1 透視

透視將3d場景轉換成2d像素。

光柵化的話,通過矩陣投影將3d轉換成2d(透視除法)和深度信息(z-buffer),根據深度判定前后關系,離攝像機進的覆蓋遠處。射線追蹤通過從攝像機射出射線,判定是否相交,距離近的覆蓋遠的。光柵化效率更高,目前被GPU支持。

3.2 著色

著色生成像素的顏色。著色計算所有的光照信息在材質表面的行為,并最終生成反射形成顏色。

光由大量光子構成,光子傳播到材質上,會根據表面的垂直方向(法線)和入射方向形成反射,反射最終到達人眼形成顏色,材質的感覺比如鏡面、塑料、金屬也跟材質的各種屬性決定。漫反射,材質表面比較粗糙,光朝這個各個方向反射,效果取決與光的方向和表面法線,用于模擬塑料等材質。鏡面(光澤)反射,光的反射主要集中在特定方向,效果取決與光的方向、表面法線和觀察方向,用于模擬鏡子、金屬等材質。

透明,光傳播到類似于玻璃球這樣的透明材質,會有反射和折射現象,反射和折射滿足菲涅耳公式。用于模擬,玻璃球、水等透明的材質。

次表面反射,實現半透明效果,用于模擬皮膚等。

間接光照,光的效果不是來自光源,而是其他材質的反射。

全局光照,關照即來自光源,也來自其他材質的反射等,用于模擬更真實

射線追蹤

該算法能夠比較好的模擬自然現象,不過計算量大,廣泛應用離線渲染。

射線追蹤的路徑

1,Farward Tracing(light tracing),模擬自然界光子的運動,不過,光子的運動隨機,光子與表達介質的幾何數據求交消耗大,現實中,光源包括大量大量的光子,實現這種機制,計算消耗大,效果隨機,大量采樣才能保證效果。

2,Backward Tracing(eye tracing),從攝像機射出射線(primary ray),判定當前攝像是否和模型相交,根據模型的材質,反射生成新的射線(shadow ray),這樣射線和運算都可以控制下來。主要的話采用這種方式實現。

算法步驟:

1,生成射線。屏幕相當于攝像機前面的畫布,從攝像機位置出發,對屏幕上每個像素生成射線,carema ray(primary ray)

2,射線幾何相交。判定射線和幾何體相交,著色距離最近的片段,傳遞給下一階段,沒有任何相交片段的話,重復步驟1.

3, 著色片段,根據介質屬性和光的傳播特性,生成shadow ray,最終著色,形成像素,傳遞下一階段。

4,顯示階段,更新FrameBuffer,給屏幕顯示。

光柵化

實時渲染的主流技術,理論形成較早,有成熟的pipeline支持,性能較好,實現各種復雜效果比較麻煩,廣泛應用于游戲等領域,被GPU硬件支持。

算法步驟:

1,投影階段,3d點轉換成2d點。轉換過程為局部坐標系->世界坐標系->攝像機坐標系->NDC->屏幕坐標系,輸出2d點,給下階段使用。

2,光柵階段,2d點組成2d面,2d面填充片段,這個過程中,連續的量通過離散的量表示,會出現鋸齒。插值單個片段,獲得單個片段的屬性。輸出片段,給下階段使用。這個過程,需要透視矯正

3,著色階段,著色單個片段。根據片段的材質屬性比如光照、紋理等形成最終顏色,輸出像素,給下階段使用

4,顯示階段,投影階段會存儲相應的深度值,離攝像機進的片段輸出像素至FrameBuffer,最終給屏幕顯示。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容