opengl 深度詳解 OpenGL之深度測試

2021-10-13 10:36:57 字數 1987 閱讀 9480

深度緩衝是在三維圖形中處理影象深度座標(個人認為可以理解成距離我們觀察攝像機遠近的距離)的過程----from wiki

這聽起來不好理解啊啊啊啊。

所以就舉個栗子嘍xd,就好比我可能要按由近到遠順序渲染兩個面(實際上是任意順序,我是說假如按這個順序),近處的麵先渲染,之後渲染遠處的面,但是如果沒有開啟深度測試glenable(gl_depth_test),那麼遠的面將要覆蓋掉我們近處渲染的面,顯然這不是我們所想要看到的。所以此時就需要深度測試,遠的面的深度值與近處的面的深度值進行比較,一旦遠的面深度值比較大即距離我們較遠,那麼該片段就會被丟棄掉,但這與面剔除似乎是不一樣的,面剔除是根據面向觀察者和背向觀察者去判斷是否丟棄片段,不知道我這樣講是否正確,求看到此篇的大神用力的打我臉!

其中我最不理解的「丟棄片段」(為什麼片段丟棄後我攝像機移動,還是能看到原先背向我的那一些片段?)後來發現僅僅是在此幀渲染時丟棄這些片段。但是之後攝像機一旦移動那麼又是渲染另一幀,所以重新進入渲染管線進行渲染,同時這就是為什麼我們要建立頂點陣列緩衝物件的原因,否則我們就要建立vbo,設定頂點指標屬性等等複雜操作。雖然現代的opengl是不支援不建立vao的。

深度緩衝區的原理:

最初先使用glclear(gl_depth_buffer_bit)把所有視窗上的畫素的深度值設定為最大值。

然後在場景中以任意順序繪製所有物體。opengl計算把每乙個繪製表面轉換為視窗上一些畫素的集合,此時沒有啟動深度測試並不考慮是否被其他物體遮擋。所以可能導致遠的繪製表面把近的繪製表面覆蓋掉

其次,opengl會計算這些表面和觀察平面的距離。如果啟用了深度緩衝區,在繪製每個畫素之前,opengl會把它的深度值和已經儲存在這個畫素的深度值進行比較。如果新畫素深度值

深度測試的筆記:

1.深度緩衝是由我們使用的建立視窗庫自動建立的,我使用的是glfw庫所以就由它建立,同時它在大部分系統上將深度值儲存為24位的浮點數

2.深度測試在渲染管線(pipeline)中是在模板測試之後

3.opengl執行深度測試時,如果此片段測試通過,opengl自動在深度緩衝區儲存片段的 z 值,否則將丟棄該片段

4.螢幕空間座標直接有關的視區,由glviewport()函式給定(glviewport()在預設情況下,視口被設定為佔據開啟視窗的整個畫素矩形),同時也可由片段著色器中glfragcoord的x和y的分量訪問,同時z座標也包含了片段實際深度值

5.片段著色器的執行相當費時,提前深度測試可以更早的放棄用於那不會出現的片段(不知道算不算要點)

6. 在某些情況下,我們需要進行深度測試並相應地丟棄片段,但我們不希望更新深度緩衝區,基本上,可以使用乙個唯讀的深度緩衝區,此時可以通過gldepthmask(gl_fasle)來禁止對緩衝區寫入,實際上,只要存在深度緩衝區,無論是否啟用深度測試,opengl在畫素被繪製時都會嘗試將深度資料寫入到緩衝區內。

7.gldepthfunc()如果引數是gl_less,那麼將設定成在片段深度值小於緩衝區深度時通過測試,否則丟棄片段,具體引數可以見下表:

深度值的精度(將平截頭題中的z值轉換成[0.0,1.0]範圍內然後進行深度值的比較):

計算這個精度有兩個轉換公式

和兩者對應的函式分別如下

和其中前者是非線性的轉換而後者是線性的轉化,但是後者的話在實踐中是幾乎從來不使用這樣的線性深度緩衝區。如果使用線性,那麼100單位和1單位精度是基本一樣的,而非線性他們在z很小的時候有很高的精度(即函式變化快,較為精確),而較大的 z 值有較低的精度。因為我們所做的就是要越近的物體比較越精細(函式變化越快)才能更好的渲染細節,遠的物體比較個大概即可(此處原因是我個人理解,不知道我這樣講是否正確,求看到此篇的大神用力的打我臉!),所以常使用前者。

兩者計算比較圖

使用前者那麼渲染出來的結果如下:

z值由小變大,很快顏色就由暗變亮,這就說明只要短短移動一點距離,變化就越明顯,暗色就快速的變亮

使用後者渲染圖

由暗變亮需要很長距離的變化,這就是兩者區別

最後一點,如果發現影象閃爍考慮是否發生了深度衝突及兩個影象的某個部分深度相同造成的

-----------2016/12/14

openg離線包 OpenGL離線渲染和緩衝區物件

理論 輸入 影象,點,線。輸出 影象 實現方案 從一般到特殊 1.不支援fbo 主要介紹pc上,移動裝置如果不支援fbo要實現離線渲染那就實在沒轍了。gldrawbuffer gl back glreadbuffer gl back 設定讀寫時後快取區。一般pc都支援雙緩衝機制,如果沒有gl bac...

OpenGL學習筆記之一 什麼是OpenGL

opengl到底是什麼?制定並維護的規範 specification opengl規範嚴格規定了每個函式該如何執行,以及它們的輸出值。至於內部具體每個函式是如何實現 implement 的,將由opengl庫的開發者自行決定 譯註 這裡開發者是指編寫opengl庫的人 因為opengl規範並沒有規定...

openGL 深度測試

opengl裡常出現深度測試,一直不清楚。今天就來弄清楚。1 什麼是深度?深度其實就是該象素點在3d世界中距離攝象機的距離 繪製座標 深度快取中儲存著每個象素點 繪製在螢幕上的 的深度值!深度值 z值 越大,則離攝像機越遠。深度值是存貯在深度快取裡面的,我們用深度快取的位數來衡量深度快取的精度。深度...