openGL渲染管線

實時渲染的一些名詞

  • 幀數:

    • 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)

這裏寫圖片描述

  1. Vertex Shader,頂點着色器:

    • 頂點變換:移動,旋轉,縮放,座標系轉換,投影變換。

    • 光照計算:做法線變換和法線規格化。即頂點位置改變後,法線位置需要跟着改變,然後再做歸一化。

    • 紋理座標轉換:修改UV,偏移縮放等。

  2. PrimitiveAssembly,圖元裝配:

    • 支持點、線、三角形三個圖元 。三角形需要根據三個頂點裝配成一個三角面

    • 對圖元裁剪(clip):保留完全在視錐體裏的圖元,丟棄完全不在視錐體中的圖元,對一半在一半不在的圖元進行裁剪。

    • 再對視錐體中的圖元進行剔除(cull):編碼來決定:正面剔除或背面剔除還是全剔除。比如有的物體的背面是看不到的,所以需要剔除。但有的物體是透明的,就保留背面。

  3. Rasterization,光柵化:把一個矢量三角形變成一個位圖圖像(填充像素),每個頂點之間會通過顏色數據自動進行插值。

  4. Fragment Shader,片段着色器

    • Pre-Fragement Operation,預處理階段:進行一些片段測試,進一步剔除不必要的信息。

      • Pixel ownership test:測試該像素用戶是否可見是否被其他窗口遮擋。

      • Scissors Test:裁剪測試,判斷是否在定義的裁剪區域內。

      • Stencil Test:模板測試,決定了像素的顏色值是否要被寫入到渲染目標。比如FPS中開狙擊鏡,只有鏡中的區域需要渲染。

      • Depth Test:深度測試。攝像機可見的深度是有範圍的,只顯示近裁剪面到遠裁剪面之間的。剔除深度高的

      • Blending:混合,對於特殊的材質(比如玻璃等半透明物體,除了玻璃的顏色還需要有其他物體的顏色信息)

      • Dithering:抖動顯示,就是用少量的顏色來表現更廣泛的顏色的。

  5. 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座標。返回顏色。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章