OpenGL的常見問題以及基礎(chǔ)的概念知識(持續(xù)更新!!!)
1.OpenGL中矩陣的概念,什么是Model,View,Project?
在OpenGL中我們知道的世界矩陣(World Matrix)/視圖矩陣(View Matrix)以及投影矩陣(Projection matirx)中
Model:世界矩陣確定一個統(tǒng)一的世界坐標,主要針對模型的平移,旋轉(zhuǎn),縮放,錯切等功能,將模型由局部空間轉(zhuǎn)換為世界空間.
View:視圖矩陣就是我們能看到的那部分場景,有攝像機/觀察者的位置等信息(設(shè)置鼠標移動,滾輪等效果),將所有世界坐標轉(zhuǎn)換為觀察坐標.
Projection:投影矩陣就是把三維體的平面投影在二維的平面顯示.
2.OpenGL中CPU和GPU之間的調(diào)度
GLSL運行在GPU,其通過接口實現(xiàn)和CPU之間的數(shù)據(jù)轉(zhuǎn)換.
OpenGL程序涉及到兩種類型的處理單元**CPU**和**GPU**.
OpenGL主程序有CPU調(diào)用運行,圖像處理部分通過GLSL交給GPU執(zhí)行.
CPU和GPU之間的數(shù)據(jù)傳遞分三步驟:
1.首先利用內(nèi)置的OpenGL函數(shù)生成一個ID號碼
2.根據(jù)需要對該ID號碼進行內(nèi)存類型的綁定,綁定完成后GPU中用于接收系統(tǒng)內(nèi)存中數(shù)據(jù)的"標識符"就準備好了,
3.對這部分內(nèi)存進行初始化,初始化的內(nèi)容來自于系統(tǒng)內(nèi)存中,這一部分功能利用glBufferData函數(shù)完成.數(shù)據(jù)由提交到GPU專用的內(nèi)存中之后,需要根據(jù)應(yīng)用場景對數(shù)據(jù)進行適應(yīng)的分配,比如有的數(shù)據(jù)當(dāng)做頂點,有的作為顏色,有的用于控制光照等等
此外,由于GPU具有高并行結(jié)構(gòu),所有GPU在處理圖形和復(fù)雜算法方面計算效率較高.CPU大部分面積為控制器和寄存器,而GPU擁有更多的ALU,邏輯運算單元用于數(shù)據(jù)處理,而非數(shù)據(jù)的高速緩存和流控制.
OpenGL中緩沖區(qū)的概念
[1] 幀緩沖(frame buffer):幀緩沖是下面幾種緩沖的合集患雇。通過幀緩沖可以將你的場景渲染到一個不同的幀緩沖中卷雕,可以使我們能夠在場景中創(chuàng)建鏡子這樣的效果藏姐,或者做出一些炫酷的特效,存放顯示用的數(shù)據(jù)的珊楼。
[2] 顏色緩沖(color buffer):存儲所有片段的顏色:即視覺輸出的效果。
[3] 深度緩沖(depth buffer):根據(jù)緩沖的z值,確定哪些面片被遮擋通砍。由GLFW自動生成。
[4] 模板緩沖(stencil buffer):與深度測試類似烤蜕,通過比較模板值和預(yù)設(shè)值封孙,決定是否丟棄片段。
數(shù)據(jù)在opengl中處理順序是: 頂點著色器 - 片段著色器 - 模板測試 - 深度測試
深度測試的概念
1.什么是深度?
所謂深度,就是在坐標系中像素Z坐標距離觀察者的距離.
OpenGL會有專門的一塊區(qū)域進行Z值(每個像素上的Z值)的存放,就是深度緩存.
2.深度緩沖區(qū)作用?
一般情況下,我們繪制圖形時,后面繪制的覆蓋前面的圖形,一般繪制的順序從后向前繪制.所以會產(chǎn)生一個性能問題"遮蓋部分",先繪制的會被覆蓋,而你觀察到的只有最上面的那個模塊下面被掩蓋的繪制就沒有意義!
深度測試就出現(xiàn)來解決遮蓋問題
作用:開啟深度測試繪制的時候會檢查Z值,同一個區(qū)域靠近觀察者的進行繪制,其他被遮蓋的區(qū)域不予繪制,與繪制的順序無關(guān).
3.如何使用深度緩存區(qū)測試?
為什么要測試,一旦開啟之后,就會先測試深度值繪制
`glEnable(GL_DEPTH_TEST);`
用上述代碼開啟深度測試默認情況下,Z值小的情況下會被覆蓋
如果觀察者在Z軸的正方向,Z值大靠近觀察者!
如果觀察者在Z軸的負方向,Z值小的靠近觀察者
如何解決深度值相同(Z值相同),造成的沖突問題?
第一種方法:在第二次繪制相同Z值時,稍微偏移一點點解決遮蓋問題
`注意:必須要非常小心確保Z值的間隙,否則就像冰箱貼著的冰箱貼一樣會懸浮起來的風(fēng)險`
第二種方法:采樣glPolygonOffset函數(shù),使得可以調(diào)節(jié)片段的深度值,使得深度值偏移而不會產(chǎn)生懸浮重點內(nèi)容