OpenGL 面經總結


OpenGL Pipline - 渲染管線

  1. 頂點數據的輸入: 送入到渲染管線的數據包括頂點坐標、紋理坐標、頂點法線和頂點顏色等頂點屬性。需要在繪制指令中傳遞相對應的圖元信息。常見的圖元包括:點(GL_POINTS)、線(GL_LINES)、線條(GL_LINE_STRIP)、三角面(GL_TRIANGLES)。
  2. 基於頂點的操作 (Vertex Shader): 頂點着色器處理頂點,每個頂點由空間矩陣變換,有效地將其3D坐標系統改變為新的2D坐標系統。
  3. 圖元裝配 (Geometry Shader - 幾何着色器): 以指定的順序連接頂點構建基本體狀態。幾何着色器輸出一個或多個其他的圖元(比如,三角面)。
  4. 圖元處理 (Graphic Primitives): 屏幕外面的任何圖元都被剪輯並在下一階段忽略,以減少進入光柵化的圖元的數量,加速渲染過程。
  5. 光柵化: 測試像素是否在圖元的邊內。如果他們不是,他們被丟棄。如果他們在圖元內,他們被帶到下一個階段。通過測試的像素集被稱為片段。
  6. 片面處理 (Fragment Shader): 進行光照計算以及陰影處理,決定屏幕上片段內的像素的最終顏色。
  7. 片元操作: 片段被提交到幾個測試,如:透明度(Alpha)測試,模板(Stencil)測試,深度(Depth)測試等;沒有經過測試的片段會被丟棄,不需要進行混合階段;如果一個片元成功的通過了所有激活的測試,那么他就可以直接被繪制到幀緩存中了,它所對應的像素的顏色值會被更新。

OpenGL中 Shader  - 各種着色器在管線中的位置和作用

1. 頂點着色器 (Vertex Shader)

  • 輸入:頂點數據。通過glVertex*()等函數指定的頂點數據和跟它相關的法向量(glNormal*())、顏色(glColor*())等屬性信息都會經過頂點處理器的處理,傳給下一個階段。
  • 作用: 把輸入的頂點坐標乘以一系列幾何變換矩陣,Vertex Shader只知道處理頂點
    •   矩陣變換位置:MVP矩陣(模型--視圖--投影矩陣)頂點着色器的位置輸入保存的是物體坐標,而輸出的坐標保存為裁剪坐標。
    •   計算光照公式生成逐頂點顏色
    •   生成或者變換紋理坐標
 1 //Simple example of vertex shader 
 2 layout (location = 0) in vec3 aPos; // the position variable has attribute position 0 
 3 out vec4 vertexColor; // specify a color output to the fragment shader
 4 void main()
 5 {
 6     gl_Position = vec4(aPos, 1.0); // see how we directly give a vec3 to vec4's constructor
 7     vertexColor = vec4(0.5, 0.0, 0.0, 1.0); // set the output variable to a dark-red color
 8 }

2. 片段着色器 - Fragment Shader

  • 輸入:光柵化后產生的圖元。通過重復執行(每片元一次)將3D物體中輸入值的顏色等屬性計算出來送入后繼階段。
  • 作用:
    • 計算顏色
    • 獲取紋理值
    • 往像素點中填充顏色值(顏色值或者紋理值)
1 // Simple example of Fragment Vartex
2 out vec4 FragColor;
3 in vec4 vertexColor; // the input variable from the vertex shader (same name and same type)  
4 void main()
5 {
6     gl_FragColor = vertexColor;
7 } 

3. 鑲嵌控制着色器 - TESS  Control  Shader (TCS)  - OpenGL 4.*支持

  • 輸入:Patch (一個patch是多個頂點的集合;它每個頂點的屬性:坐標,顏色,紋理坐標等等)
  • 作用:把一個圖元分割成很多圖元,在TCS里儲存:圖元里每個邊要被分割成多少段,在圖元內部還要怎么繼續分割;

N.B. glBegin函數的參數必須是GL_PATCHES

4. 鑲嵌評估着色器 - TESS  Evaluation  Shader (TES) - OpenGL 4.*支持

  • 輸入:一系列被分割后產生的新頂點。
  • 作用:把每個頂點的局部坐標(由Tessellation Primitive Generator從三角形內部的坐標轉換而來的)變換成世界坐標,以及把頂點相應屬性(顏色,紋理坐標等)轉換成真正且有效的屬性值。

N.B. 圖元裝配器會將TES輸出的坐標裝配從一個個三角形 

5. 幾何着色器 - Geometry Shader

  • 輸入:一個圖元 (Primitives)
  • 作用:根據新圖元生成新一個或者多個圖元

什么是model,view,project矩陣

  • 模型矩陣(Model Matrix): 將模型從自己局部的模型坐標系變換到OpenGL的世界坐標系。
  • 視圖矩陣(View Matrix): 將世界坐標變換到從虛擬攝像機的視角所觀察到的空間。
  • 投影矩陣(Projection Matrix):將3D物體的頂點坐標從觀察空間變換到齊次裁剪空間。再將頂點的深度值z保存在頂點經過變換得到的齊次坐標的w分量中。最后,把頂點在齊次空間中的坐標通過將x,y,z分量除以w分量的方式,將齊次坐標轉為NDC。

齊次坐標

既能夠用來明確區分向量和點,同時也更易用於進行仿射變換。不管進行多少次變換,都可以表示成矩陣連乘的形式,將極大的方便計算和降低運算量。其次坐標 w = 1 為坐標,w = 0 為向量。

平移                     縮放           旋轉 

其次坐標怎么實現透視:每個向量的 z 分量表示了距離相機的距離。因此,z 分量越大,矢量應該越小。w 分量影響這個縮放,所以投影矩陣用 z 分量的值改變 w 分量的值。將每個點的在觀察空間下的z坐標拿來,除以該點在齊次剪裁空間下的x和y的值(x = x/z, y = y/z),顯示出來便是透視投影后的圖像。

齊次剪裁空間:裁剪坐標是-1到1,不在里面就不會顯示

裁剪的位置:渲染管線中進行裁剪的位置是透視投影之后,齊次除法之前

剔除算法

  • 視錐體剔除(應用程序階段):依據主要是根據攝像機的視野(field of view)以及近裁減面和遠裁剪面的距離,將可視范圍外的物體排除出渲染
  • 背面剔除(光柵化階段):先判定多邊形的朝向,並和當前的觀察方向進行比較。opengl中設置背面剔除相關函數:glFrontFace(GL_CW)設置順時針或者逆時針為正面,glCullFace(GL_BACK)設置剔除正面或者背面
  • 提前深度剔除(early -z)

Early-z 

  • 定義:在光柵化之后,fragment之前進行一次深度測試,如果深度測試失敗,就不必進行fragment階段的計算了,因此在性能上會有很大的提升。但是最終的ZTest仍然需要進行,以保證最終的遮擋關系結果正確。先繪制較近的物體,再繪制較遠的物體(僅限不透明物體)
  • 實現:對於所有不透明的物體(透明的沒有用,本身不會寫入深度),首先用一個超級簡單的shader進行渲染,這個shader不寫入顏色緩沖區,只寫深度緩沖區,第二個pass關閉深度寫入,開啟深度測試,用正常的shader進行渲染。
  • 若開啟了alpha test,則不支持early-z。因為alpha test是在光柵化之后才測試對應的像素是否可見而且最終需要靠Z-Check進行判斷這個像素點最終的顏色。若用了early-z則會提前遮擋了。
  • Unity:為shader指定渲染隊列是一種從前向后渲染功能的工具。使用pass預傳Z值渲染。

OpenGL中要用到哪幾種Buffer?

緩沖區保存在GPU內存中,它們提供高速和高效的訪問。

  • 幀緩沖 (Frame Buffer) :幀緩沖區是下面幾種緩沖的合集,他可以保存其他確實有內存存儲並且可以進行渲染的對象,例如紋理或渲染緩沖區。
  • 顏色緩沖 (Color Buffer) :存儲所有片段的顏色:即視覺輸出的效果。
  • 模板緩沖 (Stencil Buffer) :為屏幕上的每個像素點保存一個無符號整數值。用於模板測試中。決定是否丟棄片段。
  • 頂點緩沖 (Vertice Buffer):管理頂點數組數據。
  • 深度緩沖 (Depth Buffer):處理圖像深度坐標,確定渲染場景中哪部分可見、哪部分不可見的。

陰影 (Shader) 應該怎么實現

紋理映射 - Shader Mapping

  • 原理:以光的位置為視角進行渲染,我們能看到的東西都將被點亮,看不見的一定是在陰影之中。
  • 步驟:把光源位置設置一個相機,然后相機顯示的視角存到深度緩存中。渲染正常模型並且計算深度緩存和模型的深度值,如果此時的深度值大於光源視覺下的深度值,那就顯示陰影反之則顯示正常的亮面。計算的時候需要減去一個bias值,否則會出現陰影計算不准的情況。
  • 深度貼圖 (Depth Map):從光的透視圖里渲染的深度紋理,用它計算陰影。由於光是平行的定向光,我們將為光源使用正交投影矩陣。陰影的頂點着色器將一個單獨模型的一個頂點,使用lightProject * lightView 變換到光空間中。片段着色器為空,因為無顏色緩沖。

問題

  • 陰影失真(Shadow Acne):在距離光源比較遠的情況下,多個片元可能從深度貼圖的同一個值中去采樣。
  • 陰影偏移(shadow bias):對表面的深度(或深度貼圖)應用一個偏移量,這樣片元就不會被錯誤地認為在表面之下了。
// 方法一:簡單的減去偏移量
float bias = 0.005;
float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0;
// 方法二:根據表面朝向光線的角度更改偏移量
float bias = max(0.05 * (1.0 - dot(normal, lightDir)), 0.005);
  • 懸浮(Peter Panning):使用陰影偏移的值有可能足夠大,以至於可以看出陰影相對實際物體位置的偏移
  • 正面剔除(front face culling):當渲染深度貼圖時候必須開啟GL_CULL_FACE(GL_FRONT),正面剔除完全移除了地板。

浮點數精度會不會導致這個距離判斷出現問題,導致沒有陰影的表面也上了陰影?

GPU的陰影圖只能保存0-1之間的數值,而不能直接保存計算得到的距離,為了更好的控制精度。如果是純浮點數的精度,整數部分會造成極大的浪費。最終保存的depth是除以鏡頭的最遠距離。當渲染物體離燈光都比較近的時候可以用depth的二次方,為了拉大之間的精度,當渲染物體離燈光都比較遠時,可以用depth的log(n)。

怎么使陰影邊緣虛化

采樣了中心點,再采樣了四個頂點,求平均值。假設只有B、C兩個點是有陰影的,AED是沒有陰影的,算起來,這個點就會有淡淡的陰影。

PSSM平行分割陰影 - 平行光陰影

一種根據距離遠近采用多個深度紋理渲染陰影的方法,適合用於室外大場景中的平行光比如太陽形成的陰影。在shader里面,根據不同的距離,采樣不同的陰影圖。(將視錐體平行划分為3個區域,代號分別為1、2、3。這三個區域在渲染陰影的時候分別采用不同的陰影圖sm1、 sm2、sm3)。彌補了大場景陰影細節可能出現的不足。

 

點陰影 - Point Shadows

算法和陰影映射差不多:從光的透視圖生成一個深度貼圖,基於當前fragment位置來對深度貼圖采樣,然后用儲存的深度值和每個fragment進行對比,看看它是否在陰影中。

常見的光照模型:Lambert模型、Blinn-Phong模型與Phong模型

Lambert模型 (漫反射)

粗糙的物體表面向各個方向等強度地反射光,這種等同度地散射現象稱為光的漫反射。

 

 

  • Iad: 環境光
  • K:材質對環境光的反射系數
  • Ia: 環境光強度
  • I_ld: 方向光 = 光線方向與法向量的點積
  • Il: 點光源強度,
  • N: 頂點單位法向量
  • L: 從頂點指向光源的單位向量
  • Idiff: 漫射光

Phong和Blinn-Phong是計算鏡面反射光的兩種光照模型,Blinn-Phong比Phong模型效率更高為默認鏡面光,但寫實效果沒有Phong好。

Phong模型 (鏡面反射)

  • Ks:物體對於反射光線的衰減系數
  • V:從頂點到視點的觀察方向
  • R:光入射方向I的反射光
  • Shininess:高光系數。shininess 越高,反射光的能力越強,散射得越少,高光點越小

Blinn-Phong模型 (修正鏡面光)

  • Ks:物體對於反射光線的衰減系數
  • N:入射點的法向量
  • H:光入射方向 I 和視點方向V的中間向量
  • Shininess:高光系數

GLSL的如何傳遞數據?

  • uniform 變量 :uniform變量是外部application程序傳遞給 vertex shader 和 fragment shader的變量。它是application通過函數glUniform**()函數賦值的。在 vertex shader 和fragment shader內部,uniform變量不能被shader程序修改。一般用來表示:變換矩陣,材質,光照參數和顏色等信息。
  • attribute 變量:能在vertex shader中使用的變量且是只讀的。在application中,一般用函數glBindAttribLocation()來綁定每個attribute變量的位置,然后用函數glVertexAttribPointer()為每個attribute變量賦值。來表示一些頂點的數據,如:頂點坐標,法線,紋理坐標等。
  • varying 變量:是vertex和fragment shader之間做數據傳遞用的,並在光柵化(Rasterization)的時候,這些變量也會跟着一起被光柵插值。一般vertex shader修改varying變量的值,然后fragment shader使用該varying變量的值。

頂點法線和面法線的作用。

  • 面法線:垂直於平面,位於中央,經常用於flat着色。
  • 點的法線:在使用Phone或Gouraud模型時計算光照使用。如果一個面上的所有法線都一樣,他們的光照也就一樣,就會產生 flatness 效果。而如果把每個頂點的法向設置不同,則更平滑。

CPU和GPU之間的調度

GLSL運行在GPU,其通過接口實現和CPU之間的數據轉換。OpenGL主程序有CPU調用運行,圖像處理部分通過GLSL交給GPU執行。

CPU和GPU之間的數據傳遞分三步驟:

  1. 首先利用內置的OpenGL函數生成一個ID號碼
  2. 根據需要對該ID號碼進行內存類型的綁定,綁定完成后GPU中用於接收系統內存中數據的"標識符"就准備好了,
  3. 對這部分內存進行初始化,初始化的內容來自於系統內存中,這一部分功能利用glBufferData函數完成.數據由提交到GPU專用的內存中之后,需要根據應用場景對數據進行適應的分配,比如有的數據當做頂點,有的作為顏色,有的用於控制光照等等

此外,由於GPU具有高並行結構,所有GPU在處理圖形和復雜算法方面計算效率較高.CPU大部分面積為控制器和寄存器,而GPU擁有更多的ALU,邏輯運算單元用於數據處理,而非數據的高速緩存和流控制.

深度測試

  • 深度:是在坐標系中像素Z坐標距離觀察者的距離
  • 深度測試:解決遮蓋問題。通過檢查Z值,同一個區域靠近觀察者的進行繪制,其他被遮蓋的區域不予繪制,與繪制的順序無關. 用glEnable(GL_DEPTH_TEST),Z值小的情況下會被覆蓋
  • 深度沖突:為兩個物體靠的很近時確定誰在前,誰在后時出現了歧義
    • 解決
      1. 在第二次繪制相同Z值時,稍微偏移一點點解決遮蓋問題;
      2. 啟用Polygon Offset方式解決,讓深度值之間產生間隔。
    • 預防
      1. 讓物體之間不要離得太近;
      2. 將近裁剪面設置得離觀察者遠一些。
      3. 使用更高位數的深度緩沖區,使精確度提高。 

游戲中幀同步與狀態同步

幀同步:

游戲中的操作同步。是一種客戶端與服務器的同步方式,是為了實現高實時性,高同步性的應用而產生的。

  • 實時性
    • 所有玩家的指令一定是要及時地同步到所有玩家的終端上的。
    • 客戶端發出指令到服務器需要時間,服務器發送指令到其他客戶端也需要時間,發送消息的周期一定要短
    • 同步消息頻率越大,對於性能要求越高,成本也就越高。
    • 能夠減小服務器的壓力,也為了能夠更快地轉發信息,游戲的邏輯一般會放到客戶端去執行,這樣更快
  • 同步性
    • 所有玩家收到的信息一定要是一致的
    • 客戶端需要將指令同步后然后在固定的幀間隔內進行邏輯計算,保證每個客戶端收到相同指令都會運行出唯一的結果
    • 為了應對玩家掉線的情況,服務器應該保存一場游戲中的指令,在玩家斷線重連后發送到玩家終端。

狀態同步:

游戲中的各種狀態同步。一般的流程是客戶端上傳操作到服務器,服務器收到后計算游戲行為的結果,然后以廣播的方式下發游戲中各種狀態,客戶端收到狀態后再根據狀態顯示內容。

  • 不同玩家屏幕上的表現的一致性並不是重要指標, 只要每次操作的結果相同即可,狀態同步對網絡延遲的要求並不高。RPG用的比較多。
  • RPG的動畫效果做的很華麗,放技能之前一般也有一個動畫前搖,同時將攻擊請求提交給服務器,等服務器結果返回時,動畫也播放完畢,之后就是統一的傷害效果和結算。 

如果判斷點在三角形內

內角和法:

連接點P和三角形的三個頂點得到三條線段PA,PB和PC,求出這三條線段與三角形各邊的夾角,如果所有夾角之和為180度,那么點P在三角形內,否則不在,

 

同向法:

當選擇某一條邊時,只需驗證點P與該邊所對的點在同一側即可。通過叉積來實現。連接PA,將PA和AB做叉積,再將CA和AB做叉積,如果兩個叉積的結果方向一致,那么兩個點在同一測。判斷兩個向量的是否同向可以用點積實現,如果點積大於0,則兩向量夾角是銳角,否則是鈍角。

 

 

 

  • 點乘的幾何意義:可以用來表征或計算兩個向量之間的夾角,以及在b向量在a向量方向上的投影,值是標量
  • 叉積的幾何意義:3維空間中,可以通過兩個向量的叉乘,生成第三個垂直於a,b的法向量,值是向量。2維中,兩個向量的叉乘等於由向量a和向量b構成的平行四邊形的面積。

如何判斷兩個三角形相交

1. 檢測兩個三角形邊與邊之間是否相交。

    • 設有2個線段 a , b 。線段 a 的2個端點為:a1 , a2 , 線段 b 的 2個端點為:b1 , b2 。
      條件1:是否 向量 a1->b1 、a1->b2 分別位於向量 a1->a2 的左右2端。
      條件2:是否 向量 b1->a1 、b1->a2 分別位於向量 b1->b2 的左右2端。
      當條件1和條件2同時滿足時,線段 a , b 相交。叉乘完成。

2. 檢測一個三角形是否完全在一個三角形內部:判斷三角形的三個點是否在三角形內。

PBR是什么

Physically Based Rendering:基於物理的反射。與我們原來的Phong或者Blinn-Phong光照算法相比總體上看起來要更真實一些。

 PBR光照模型的滿足條件

  1. 基於微平面(Microfacet)的表面模型。
    1. 假設一個粗糙度(Roughness)參數,用統計學的方法來概略的估算微平面的粗糙程度。基於一個平面的粗糙度來計算出某個向量的方向與微平面平均取向方向一致的概率。這個向量便是位於光線向量 和視線向量 之間的中間向量。
  2. 能量守恆:出射光線的能量永遠不能超過入射光線的能量
  3. 應用基於物理的BRDF。

反射率方程:

計算了點p 在w0 方向上被反射出來的輻射率L0(p, w0)的總和。

 
  • w: 觀察方向,wi : 入射方向,Li : 輻射率,Ω:以點p為球心的半球領域Ω內所有方向上的入射光wi.
  • fr : cook-torrance BRDF 函數:求出每束光線對一個給定了材質屬性的平面上最終反射出來的光線所作出的貢獻程度(射出光線的輻照度和攝入光線輻射率的比值)
  • flambert : Lambert 漫反射, k: 入射光線中被折射部分的能量所占的比率, c : 表面顏色, pi : 為了對漫反射光進行標准化.
  • fcook-torrance : 鏡面反射, DFG: 三種不同的分布函數,正態分布,幾何函數,菲涅爾函數,

與phong光照模型的區別

  • 將光源分為間接光源和直接光源這兩部分。
    • 間接光源:來自於物體反射或者大氣散射等的光能。
    • 直接光:來自於場景光源直接照射的部分
  • 將材質分為金屬和非金屬分別進行處理,PBR模型在渲染金屬材質方面與phong模型相比特別突出
    • 金屬度是一個0到1范圍內的浮點數,表示被渲染物的表面材質是不是金屬,0表示非金屬,1表示金屬,0和1之間的值的作用是表現諸如沾有沙子的金屬表面之類的復雜材質。
  • 導入粗糙度(roughness)和環境光遮蔽(ambient occlution,簡稱ao)來描述材質表面的微小結構對其光學特性的影響。PBR模型使用粗糙度代替高光因子,並使用環境光遮蔽模擬微小表面產生的細小陰影;
  • 漫反射和高光反射的能量守恆。

 

法線貼圖

法線貼圖:為每個fragment提供一個法線,光照使表面擁有了自己的細節。主要適用於凹凸不太明顯,細節很多,需要表現實時光照效果,不會太靠近觀察的物體的情況 。

生成:采取紋理的灰度圖,根據兩個像素間的灰度差,形成U,V兩個向量,然后兩個向量的叉積就是法線的方向。

為什么是藍色:在切線坐標系里,定義順序是Tangent、Binormal、Normal,而Normal處於z方向,法線貼圖的法線值大多數時候是接近於(0,0,1)。

如何繪制半透明物體

方法一:使用混合來實現半透明效果,glEnable(GL_BLEND); 只有在RGBA模式下,才可以使用混合功能,顏色索引模式下是無法使用混合功能的

方法二:三維繪圖:

  • 在繪制半透明物體時將深度緩沖區設置為只讀,glDepthMask(GL_FALSE);
  • 雖然半透明物體被繪制上去了,深度緩沖區還保持在原來的狀態。再要繪制不透明物體時,只需要再將深度緩沖區設置為可讀可寫的形式即可。
  • 總結:首先繪制所有不透明的物體。如果兩個物體都是不透明的,則誰先誰后都沒有關系。然后,將深度緩沖區設置為只讀。接下來,繪制所有半透明的物體。如果兩個物體都是半透明的,則誰先誰后只需要根據自己的意願。

Mipmap 是什么

  • 定義:貼圖渲染中常有的技術,為加快渲染進度和減少圖像鋸齒,貼圖被處理成由一條列被預算和優化過的圖片組成的文件。
  • 原理:把一張貼圖按照2的倍數進行縮小。直到1X1。把縮小的圖都存儲起來。在渲染時,根據一個像素離眼睛為之的距離,來判斷從一個合適的圖層中取出texel顏色賦值給像素
  • 圖像壓縮算法
    1. 最近相鄰插值:計算量很小,算法簡單,運算速度較快,但重新采樣后顏色值有明顯的不連續性,圖像質量損失較大,會產生明顯的馬賽克和鋸齒現象。
    2. 兩次線性插值:基本克服了最近相鄰插值算法顏色值不連續的特點,因為它考慮了待測采樣點周圍四個直接鄰點對該采樣點的相關性影響。但縮放后圖像的高頻分量受到損失, 圖像邊緣在一定程度上變得較為模糊。
    3. 兩次立方插值:不僅考慮到周圍四個直接相鄰像素點顏色值的影響,還考慮到它們顏色值變化率的影響,產生比兩次線性插值更為平滑的邊緣,計算精度很高,處理后的圖像像質損失最少。但計算量最大,算法也最為復雜的
  • 優點:會優化顯存帶寬,用來減少渲染,因為可以根據實際情況,會選擇適合的貼圖來渲染,距離攝像機越遠,顯示的貼圖像素越低,反之,像素越高。
  • 缺點:會占用內存,因為mipmap會根據攝像機遠近不同而生成對應的八個貼圖

怎么選擇mipmap的level:由於gpu每次計算的不是一個像素,它會同時計算四個屏幕像素,可以利用這個特點,通過差分法求當前周圍四個屏幕像素在在uv上投影后的紋素后在水平方向和垂直方向便宜的最大距離,,取得這個最大距離的2的對數結果就是當前像素的mipmap級別。這個偏移的距離L大於1,表示一個屏幕像素覆蓋了超過一個紋素,為了讓這個一個像素覆蓋一個紋素,所以需要減少圖片的大小而且由於mipmap級別間圖片的水平或者豎直方向比例大小為2倍關系,所以用這個取2的對數,就可以實現屏幕一個像素覆蓋一個紋素了

LOD是什么?作用是什么?優缺點是什么?

  • 全稱Level Of Detail,“多層級細節”
  • LOD會根據模型距離攝影機的距離,選擇不同精度的模型,攝影機越近則選擇高精度的模型,遠則反之。
  • 優點:提高渲染效率,優化了性能。  缺點:增加了內存占用。

四元樹

定義:一種樹狀數據結構,在每一個節點上會有四個子區塊。四元樹常應用於二維空間數據的分析與分類。它將數據區分成為四個象限。

應用:圖像處理、空間數據索引、2D中的快速碰撞檢測、稀疏數據等

四元數(Quaternion)

四元數:用於表示旋轉。其中x,y,z 代表的是向量的三維坐標,w代表的是角度。q = (x, y, z, w) = xi+yj+zk+w (i= j2 = k= -1)

優點

  • 能進行增量旋轉
  • 存儲空間小,計算效率高
  • 避免萬向鎖

缺點:單個四元數不能表示在任何方向上超過180度的旋轉。

歐拉角:它用三個數描述從一個坐標系到另一個坐標系的變換,每個數分別是繞某一個坐標軸轉動的角度。旋轉軸順序為 (Z, Y, X), 每次采用旋轉后的坐標系而不是原始坐標系。沒有約定好旋轉軸順序和坐標系選擇的歐拉角是沒有意義的。容易遇到萬向鎖。

萬向鎖:無論heading和bank為多少度,只要pitch為±90°(即繞第二個軸的旋轉),就會出現萬向鎖現象。

避免萬向鎖:限制旋轉的角度范圍。

2維碰撞檢測

  • 軸對稱包圍盒(Axis-Aligned Bounding Box):判斷任意兩個(無旋轉)矩形的任意一邊是否無間距,從而判斷是否碰撞。
  • 圓形碰撞(Circle Collision):通過判斷任意兩個圓形的圓心距離是否小於兩圓半徑之和,若小於則為碰撞。
  • 速度過快/體積過小導致物理引擎檢測不到碰撞,如何解決。
    • 連續碰撞檢測:在移動時先判斷移動后的位置與現在的位置作射線檢測,若有碰撞則移動失敗否則移動成功。
    • 把Mesh包含在膠囊體里面,可以保證不會穿模。

ECT1壓縮方式實現alpha

因此遇到半透明的圖時, 需要將原貼圖的alpha抽離,一分為二並別壓縮,最后在渲染時再合並計算。將一個圖片生成兩個紋理,一個是rgb,一個rgb中的r存儲着圖片的alpha數據。在繪制的時候使用紋理單元,將帶有alpha數據的rgb做為另個帶rgb紋理的alpha。

1024*1024的圖片有多大, 32 位

大小=寬*高*位深(24位,16位,8位)/8 = 1024 * 1024 * 32 / 8 = 4MB 

參考材料

  1. https://zhuanlan.zhihu.com/p/79183044
  2. https://www.zybuluo.com/cxm-2016/note/536179
  3. https://learnopengl.com/Getting-started/Shaders
  4. https://juejin.im/post/6858793605151227917
  5. https://learnopengl-cn.readthedocs.io/zh/latest/05%20Advanced%20Lighting/03%20Shadows/01%20Shadow%20Mapping/
  6. https://zhuanlan.zhihu.com/p/43899251
  7. https://juejin.im/post/6847902220982337544
  8. https://gameinstitute.qq.com/community/detail/132935
  9. https://learnopengl-cn.github.io/07%20PBR/01%20Theory/
  10. https://www.cnblogs.com/zhenbianshu/p/7061550.html
  11. https://www.cnblogs.com/wiki3d/p/shadow1.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM