實時渲染的一些名詞
幀數:
- 23幀,人眼感覺是連續的動畫
- 普通遊戲,30幀
- FPS等操作感強的遊戲,60幀
- VR遊戲 75-90幀,每幀兩個屏幕
2D渲染
- 場景由2D圖片或像素塊組成。
- 通過把一塊內存(圖片像素數據)往另一塊(顯示緩衝區)上搬運的方式,實現圖片繪製
3D渲染
- 定點數據:
- 位置座標數據
- 顏色數據(可選)
- 法線數據:代表着頂點的朝向,計算光照時,能知道哪一塊光多光少。
- 骨骼權重數據:將骨骼運動轉化成頂點的運動,一個點可能跟隨多個骨骼運動。
- 貼圖,UV。UV是指u,v紋理貼圖座標的簡稱,座標範圍是0到1。它定義了圖片上每個點的位置的信息。UV就是2D將圖像上每一個點精確對應到3D模型物體的表面。(MipMap:遠處的角色自動使用小的貼圖)
- 材質:塑料,布料,皮膚等等。
渲染API
- DirectX:微軟的圖形編程API。
- OpenGL:着色語言是OpenGL Shader Language(GLSL)跨編程語言,跨平臺。
OpenGL ES2.0 管線流程
OpenGL ES 2.0 (OpenGL for Embedded Systems)
Vertex Shader,頂點着色器:
頂點變換:移動,旋轉,縮放,座標系轉換,投影變換。
光照計算:做法線變換和法線規格化。即頂點位置改變後,法線位置需要跟着改變,然後再做歸一化。
紋理座標轉換:修改UV,偏移縮放等。
PrimitiveAssembly,圖元裝配:
支持點、線、三角形三個圖元 。三角形需要根據三個頂點裝配成一個三角面
對圖元裁剪(clip):保留完全在視錐體裏的圖元,丟棄完全不在視錐體中的圖元,對一半在一半不在的圖元進行裁剪。
再對視錐體中的圖元進行剔除(cull):編碼來決定:正面剔除或背面剔除還是全剔除。比如有的物體的背面是看不到的,所以需要剔除。但有的物體是透明的,就保留背面。
Rasterization,光柵化:把一個矢量三角形變成一個位圖圖像(填充像素),每個頂點之間會通過顏色數據自動進行插值。
Fragment Shader,片段着色器
Pre-Fragement Operation,預處理階段:進行一些片段測試,進一步剔除不必要的信息。
Pixel ownership test:測試該像素用戶是否可見是否被其他窗口遮擋。
Scissors Test:裁剪測試,判斷是否在定義的裁剪區域內。
Stencil Test:模板測試,決定了像素的顏色值是否要被寫入到渲染目標。比如FPS中開狙擊鏡,只有鏡中的區域需要渲染。
Depth Test:深度測試。攝像機可見的深度是有範圍的,只顯示近裁剪面到遠裁剪面之間的。剔除深度高的
Blending:混合,對於特殊的材質(比如玻璃等半透明物體,除了玻璃的顏色還需要有其他物體的顏色信息)
Dithering:抖動顯示,就是用少量的顏色來表現更廣泛的顏色的。
Frameduffer:保存最終的渲染數據
Shader簡介
* Shader 就是渲染管線的一部分,並且是可編程的。*
分別爲Vertex Shader和Fragment Shader
Vertex Shader:並行,每次對一個點做處理。輸入模型上每個頂點,輸出投影變換後屏幕座標系中的頂點。
- 核心函數:Pos(proj) = MVP * Pos(3D)//M,V,P分別是三個變換矩陣
光柵化:從矢量圖插值得到一個個像素點。根據窗口大小,得到的像素多少也不一定。
Fragment Shader:並行。輸入光柵化後的單個像素點,輸出帶顏色的像素點。
- 核心函數:Color = tex2D(texMain, texcoord) // 輸入參數MainTex是貼圖, texcoord是光柵化後的u,v座標。返回顏色。