遊戲引擎架構----渲染

1. 場景描述
1.1 表面建模
     矩形面片的表示:貝塞爾曲面、非均勻有理B樣條、N面片
     細分曲面(subdivision surface)
     三角網格
     =>固定鑲嵌(tessellation)
     =>動態鑲嵌細分曲面 or LOD:level of detail 物體與虛擬攝像機的距離的縮減而增加面片個數,最近的爲LOD0
     應用於可擴展的網格,如水面、地面(用高度場描述)
1.2 三角網格的表示
     法線、背面剔除
     索引化三角形表:頂點緩衝(DX)、頂點數組(OpenGL);索引存儲在索引緩衝、索引數組中
     頂點緩存優化:三角形帶、三角形扇
1.3 模型空間
     模型空間、局部空間、物體空間
     世界空間:網格示例+模型至世界矩陣(旋轉、縮放、位移)
1.4 顏色、紋理、材質
     每像素位數Bits per pixel BPP
     高動態範圍high dynamic range HDR
     頂點屬性:位置、法線、切線、顏色、紋理座標、蒙皮權重
     紋理種類:漫反射貼圖(diffuse map),法線貼圖、光澤貼圖、環境貼圖(環境反射)
     mipmap:多級漸遠紋理,用於處理莫列波紋
     紋素密度:紋素和貼圖表面的(世界空間、屏幕)面積之比
     紋理過濾:紋素->像素的採樣過程(最近鄰、雙線性、三線性、各項異性)
     材質:包含着色器、着色器的輸入參數、紋理;不包含頂點屬性
1.5 光照
     1.5.1光傳輸模型:
          局部光照模型:只考慮直接光照(每個物體不會影響其他物體的光照)
               -Phong式反射模型
                    環境光+漫反射+鏡面反射,可用BRDF表示
                    BRDF:雙反射分佈函數,入射光和人看到的光線強度圖,包含法線N,光源方向L和視線方向V
          全局光照模型:考慮間接光照(光線追蹤ray tracing, 輻射度算法 radiosity
     渲染方程/着色方程:全局光照模型可由單一數學公式描述
     1.5.2 光源模型:
          靜態光照:存儲在光照貼圖light map中,是一個紋理貼圖
                            不存儲在漫反射紋理貼圖中的原因:光照紋理貼在所有受光影響的物體上,處理動態物體經過光源的光照;更好壓縮;漫反射紋理會重複使用,不能放在其中
          環境光
          平行光
          點光
          聚光(圓錐)
          面光
          發光物體:放射光貼圖(emissive texture map)模擬,紋理的顏色以完全強度發射,不收附近光照的影響;+ 光源
1.6 虛擬攝像機
     觀察空間:攝像機位於空間原點、觀察至世界矩陣View-World
                       模型->世界->觀察:世界至觀察矩陣、又稱觀察矩陣World-View,是觀察至世界的逆矩陣
     觀察體積:view volume、近平面、遠平面
                       透視投影對應平截頭體(frustum)、正射投影對應長方體
     投影:透視投影(perspective)、正射投影(orthographic),將點從觀察空間變換至齊次裁剪空間
     齊次裁剪空間:是觀察空間的變形版本,將觀察體積轉換成標準觀察體積:一個長方體,x,y和z座標都是(-1,1)。這個座標系統爲齊次裁剪空間
     屏幕空間:二維。屏幕映射:將裁剪空間座標平移、縮放至屏幕正方形裏。渲染時,忽略面片的z座標,只使用x和y座標繪製在屏幕上(幀緩衝)
     光柵化:三角面片的片段(fragment)對應屏幕上的一個或部分像素
          -抗鋸齒(anti-aliasing)全屏抗鋸齒FSAA:耗時
                    多重採樣抗鋸齒MSAA:將每個像素拆分成多個片段,渲染前結合成單個像素
     幀緩衝:渲染後的圖像存儲在幀緩衝(frame buffer)的顏色位圖緩衝裏。顯示硬件週期性讀取緩衝。
          -雙緩衝:硬件讀取緩衝時,渲染引擎更新另一個緩衝
          -三緩衝:硬件讀取緩衝A時,若已經渲染完畢緩衝B,則可以渲染緩衝C,而不需要等A讀取完
     深度緩衝:全屏緩衝,每個像素有深度數據。每個片段有z座標,通過對比深度緩衝決定寫入幀緩衝或是丟棄,寫入幀緩衝時,更新深度緩衝
          -深度衝突:當兩個平面很接近時,由於表達精度不夠造成像素刺穿的情況
          -裁剪空間的z深度是觀察空間z座標的倒數,是非均勻分佈的,越遠離相機,越容易產生深度衝突
          -w緩衝:使用觀察空間的z座標。存儲的時裁剪空間的座標,再算倒數
模型->世界->觀察->裁剪空間->屏幕空間->幀緩衝

2. 渲染
2.1 渲染管道
     工具階段:處理網格和表面材質。
     資產調節階段:資產調節管道(asset conditioning pipeline ACP)鏈接asset,生成靜態場景數據(如BSP樹)、靜態光照
     應用程序階段(CPU):處理網格實例和子網格,每個子網格關聯至一個材質
     幾何階段(GPU):網格頂點變換、照明、投影至其次裁剪空間、使用幾何着色器處理三角形,裁剪三角形
     光柵化階段(GPU):三角形分解爲片段,片段着色器着色,深度測試、alpha測試、模板測試後輸出到幀緩衝
2.2 GPU管道
     頂點着色器可編程的。變換着色、光照頂點,如透視投影、光照、蒙皮、修改頂點位置等等。輸入是世界座標頂點位置、法線,輸出是其次裁剪空間的頂點座標和法線。頂點可以存取紋理數據(頂點紋理拾取vertex texture fetch VTF)
     幾何着色器可編程的。處理以其次裁剪座標表示的圖元,能剔除或修改圖元,生成新的圖元,如陰影體積拉伸、動態鑲嵌、布料模擬、線段分型細分模擬閃電效果等等。
     流輸出:將數據寫回內存,並回到管道初始進行處理(重歷頂點着色器和幾何着色器)。如頭髮樣條在頂點着色器上進行物理模擬,幾何着色器上變成頭髮線段,流輸出後重新在管道中渲染頭髮線段
     裁剪可配置的。在平截頭體之外的三角面片切掉
     屏幕映射:變換到屏幕空間
     三角建立、遍歷:將三角面片分解爲片段,光柵化,生成片段屬性。
     提前深度測試可配置的。丟棄部分片段
     像素着色器可編程的。輸入是片段屬性,輸出是片段顏色,也可丟棄片段,此時不輸出
     合併、混合階段:可配置的光柵運算階段(raster operation stage)。深度測試、alpha測試、模板測試。根據alpha混合片段顏色。先渲染不透明物體到幀緩衝,然後將半透明表面從後往前排序渲染
2.3 着色器
    着色語言:
          -Cg: C for graphics
          -HLSL: Dx
          -GLSL: OpenGL
     內存訪問:不能直接讀寫內存,只能通過寄存器和紋理貼圖
          寄存器:128位,能存放4個32位的整數、浮點數
          -輸入寄存器:GPU自動設置值,如頂點座標等等
          -常數寄存器:也可作爲輸入,如觀察矩陣、投影矩陣、光照參數等等
          -臨時寄存器:着色器內部存儲中間結果
          -輸出寄存器:着色器填寫。GPU會將一些輸出寄存器寫入緩存,防止重複計算
          紋理貼圖:能用渲染到紋理(render to texture RTT)將數據寫入紋理,並將場景渲染至屏幕外幀緩衝,後續的渲染階段把幀緩衝作爲紋理貼圖使用
     效果文件:Cg中爲CgFX,GLSL中爲COLLADA文件。定義struct,着色器程序(函數),全局變量;定義多個技術(technique),包含主版本和回退版本技術供低級圖形硬件使用;技術中定義多個pass,描述如何渲染一幀。pass中包含頂點、幾何、像素着色器程序函數的引用
2.4 應用程序階段
遍歷可見的網格,對子網格材質對,以材質規格設置渲染狀態,並調用底層的繪製函數(這些函數構建了GPU命令表),提交圖元至GPU
2.4.1 可見性判別:剔除(cull)不可見的物體
平截頭體剔除:包圍體積(包圍球體)判斷
遮擋剔除(occlusion culling):
     -預計算潛在可見集(potentially visible set PVS):將場景切割成區域,提供相機在該區域的可見其他區域列表。脫機或美工指定。自動方法:每個區域挑視點渲染場景,不同區域物體用不同顏色編碼,掃描幀緩衝得到可見區域表
     -入口(portal):窗戶、門等。入口建立平截頭體
     -遮擋體積、反入口(anti-portal):被物體遮擋的體積
2.4.2 提交圖元至GPU
渲染狀態、硬件狀態(render state):GPU管道內所有可配置參數,如世界觀察矩陣、光源方向、紋理綁定、深度測試是否啓用、alpha混合選項
狀態泄露:忘記設置渲染狀態,使用髒渲染狀態數據,得到錯誤渲染結果
渲染狀態是全局的,渲染狀態改變的次數越少越好。按渲染狀態排序後的結果繪製。通過深度預渲染(z prepass)防止overdraw,即一個像素繪製多次。
渲染場景兩次:1. 按深度從前到後的順序渲染深度緩衝,此時關閉着色器,僅僅更新深度緩衝
                          2.按渲染狀態排序,參照深度緩衝的結果繪製幀緩衝,最少的改變渲染顏色
                          3.從後至前的順序渲染半透明表面,此時會頻繁的切換渲染狀態
2.4.3 場景圖
快速排序、剔除物體
-四叉樹:二維,遞歸的把空間分割成象限,葉子節點有均勻的圖元數,平截頭體剔除
-八叉樹:三維版本
-包圍球樹:圖元分成小組,計算小組的包圍球,再將小組合併成大組,算大組的包圍球,遞歸至整個場景。平截頭體剔除
-BSP樹:遞歸的把場景分成兩半,分割平面任意方向。平截頭體剔除、排序
-kd樹:BSP樹的變種,依次與k維空間的軸對齊(先以x座標分割,再以y座標分割)

3. 光照
3.1 基於圖像的光照
-法線貼圖:存在RGB中,由於值域不同,所以要加偏移量
-高度貼圖:灰階。方法有視差貼圖法(parallax mapping)和浮雕貼圖法(relief mapping)。能自遮擋和自陰影
-鏡面、光澤貼圖:存儲鏡面反射參數(反射率、鏡面冪)貼圖(specular map),模擬汗水。只有反射率的有時叫光澤貼圖(gloss map)、鏡面遮罩(specular mask),0表示沒有鏡面效果的部分。只有鏡面冪的叫鏡面冪貼圖(specular power map),可控制鏡面高光的集中程度
-環境貼圖:有如全景照片,低成本反射渲染用到。球面環境貼圖、立方體環境貼圖
-三維紋理:一系列二維紋理,之間是連續的。三維紋理渲染的大理石球體,切面的貼圖連續
3.2 高動態範圍光照(high dynamic range HDR)
真是世界中光強可無限大,此技術允許保存>1強度的光,而不是限制在0-1之間。在顯示之前做一個色調映射(tone mapping),歸一化光線強度。可實現bloom effect,強光從物體邊緣溢出。HDR表示方法:RGB各用32位存儲,或者LUV中UV用8位,L用16位且以log2X存儲,以放大存儲範圍
3.3 全局光照(global illumination GI)
3.3.1 陰影
半影(penumbra)
陰影體積:從光源的位置到物體輪廓邊緣,輪廓邊緣沿光線方向延伸,生成一個陰影體積。使用特殊的全屏緩衝:模板緩衝(stencil buffer),它對應屏幕每個像素存儲一個整數值,渲染時模板緩衝可作爲遮罩。
                  首先渲染沒有陰影的場景,填充深度緩衝。渲染陰影體積並設置模板緩衝,正向的三角形+1,反向的-1。將模板緩衝中非0的區域加深顏色。
陰影貼圖:從光源的視角進行深度測試,把深度信息存儲在陰影貼圖紋理裏。再以正常方式渲染場景,對於在陰影貼圖中被遮擋的片段加深顏色。若片段到光源的距離比陰影貼圖裏的遠,則表明被遮擋。
3.3.2 環境遮擋(ambient occlusion AO)
渲染接觸陰影的技術。接觸陰影是指場景僅以環境光照明時產生的軟陰影。如管子內部的陰影、房子和地面接觸點的陰影等。計算方法是以該點爲圓心畫球體,求球體表明光照面積和球體面積的百分比。AO脫機計算成紋理,與觀察方向與入射光方向無關。
3.3.3 鏡像:環境貼圖、或者把攝像機從反射點渲染一張貼圖
3.3.4 焦散(caustics):水下的高光。投影半隨機亮點的紋理至物體表面
3.3.5 次表面反射(subsurface scattering SSS):光線在表面下散射。柔軟的效果如玉。
根據一張貼圖度量光線需要經過多少距離才能通過遮擋物,同時漫反射光照強度與光線經過物體到另一面的距離成反比,便可實現淡淡泛光的感覺
3.3.6 預計算輻射傳輸(precomputed radiance transfer PRT):預先計算來自所有方向的入射光和表面的互動
(反射等)並存到入射光查找表中。運行時迅速得到準確的光照。
3.4 延遲渲染
將光照計算從觀察空間延遲到屏幕空間。先迅速生成不含光照的場景,並將所有用於光照計算的信息存儲在幾何緩衝(G buffer)中,如深度、表面法向量、顏色、PRT係數等。完成場景渲染後用幾何緩衝的信息計算光照和着色。這樣更高效。

4. 其他渲染系統
4.1 粒子效果:由多個quad組成,都是面向攝像機的billboard
4.2 貼花(decal)
4.3 天空:先將幀緩衝填滿天空的紋理,再渲染三維物體。天空的z值最大。天空盒:盒子中心位於攝像機的位置,z值最大
4.4 地形:高度場地形(height field terrain)存爲灰階紋理貼圖,每個區域三角形數量按攝像機距離調整。地形的貼圖是紋理混合
4.5 水體

5. 覆蓋層、UI層
覆蓋層在主場景之後渲染,並關上深度測試確保他們會顯示在三維場景之上。
歸一化屏幕座標:一個軸的範圍是0-1,適應不同分辨率。但不能兩個軸都設爲0-1

6. 伽馬校正
陰極射線管CRT屏幕中,亮度值a和實際的亮度b是非線性的。b=a^gamma,gamma>1。校正此情況,顏色傳至CRT前會做個逆變換,a_new = a^(1/gamma)

7. 全屏後處理
把全屏內容傳送至像素着色器渲染。如動態模糊、景深模糊、暈影(vignette,屏幕邊角變灰)、着色(將屏幕上的顏色後處理)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章