opengl學習筆記 雙緩衝與融合技術

2022-03-25 18:28:03 字數 1158 閱讀 3545

今天看了看opengl的融合技術,聯絡前一段時間老師讓我改的乙個用他自己的框架實現的3d物體透明融合的程式,感覺到老師說的思路,不可以實現。

因為三維的透明物體,簡單的使用融合功能和融合因子是不夠的,三維物體有遠近,因此三維物體的繪製過程是利用的是深度緩衝技術。這樣的話,對於繪製透明物體與不透明物體,順序是十分關鍵的。一般來說,應該先畫不透明物體,因為透明物體的繪製需要opengl的融合功能,

glenable(gl_blend);

,但是融合功能一旦啟動,會影響後繼物體的著色。但是先畫不透明物體,又會產生新的問題。因為透明物體往往在不透明物體的前面,所以在深度測試中,透明物體的點會通過測試,所以會繪製新點,而把原來的不透明物體的點覆蓋掉。這是,opengl用了乙個方法,當畫完不透明物體後,立即將深度緩衝進行遮蔽,即修改深度緩衝為唯讀模式,不能再向深度緩衝中寫入資訊。這樣就避免了不透明物體的深度資訊遭到破壞。同時opengl還從深度緩衝中讀取深度資訊,從而決定了不透明物體哪些點需要進行融合。

因此總結了採用融合技術繪製三維物體的步驟:

1.啟動深度測試

glenable(gl_depth_test)

2.繪製不透明物體

3.設定深度緩衝為唯讀模式

gldepthmask(gl_false)

glenable(gl_blend)

glblendfunc(gl_src_alpha,gl_one)

4.繪製透明物體

5.恢復深度緩衝的可寫屬性

gldepthmask(gl_true)

gldisable(gl_blend)

在運用window平台時,需要在pixelformatdescriptor結構中設定雙緩衝。

static pixelformatdescriptor pfd=;

同時利用swapbuffer()這個函式進行緩衝的交換,在緩衝交換之前,必須進行同步操作。

opengl提供了兩個同步操作函式glflush()和glfish()

glflush()函式用於表明先前被送到的所有指令必須在有限時間內完成。在網路模式下,該函式可以強制客戶端在由命令組成的網路包還沒有填滿的情況下不等待命令而傳送該包,以便繪圖工作可以繼續進行。而glfinish()則用於強制完成先前所有的指令。

OpenGL 學習筆記 幀緩衝與後期處理

原文對應 learnopengl cn 高階opengl 幀緩衝。預設緩衝幀與幀緩衝 因為計算本身是消耗時間的,所以如果不採用雙緩衝,則會出現影象閃爍的現象,有了雙緩衝之後,顯示前緩衝區,在後緩衝區繪圖。然後交替交換顯示,只要有乙個拷貝的過程,就可以完成繪圖。這個後緩衝區,就是opengl 或者dx...

java雙緩衝 筆記

雙緩衝解決畫面閃爍問題筆記 1 每次重新整理畫面時,執行過程是 自動呼叫repaint方法,repaint方法呼叫update方法,update方法呼叫paint方法實現重畫。這個過程中paint方法需要大 量計算,用時較長,故不流暢 2 解決方法是,將paint方法執行過程不顯示在螢幕上。具體是 ...

OpenGL啟用雙緩衝時顏色變淡或者不純的解法方法

初學opengl,什麼都不太會,在開啟雙緩衝並進行實時繪圖的時候發現,顏色和設定的顏色並不完全一樣,不太純正,一直找不到原因,網際網路上也搜不到,後來有個偶然的機會,知道了原因,需要在opengl環境初始化的時候做一些配置,具體配置非常的簡單,在啟用深度測試的後面,指定所做的測試型別,如下 啟用深度...