1. 程式人生 > >OpenGL深度快取區、深度測試及alpha blend

OpenGL深度快取區、深度測試及alpha blend

顏色緩衝區】顏色緩衝區(COLOR_BUFFER)就是幀緩衝區(FRAME_BUFFER),你需要渲染的場景最終每一個畫素都要寫入該緩衝區,然後由它在渲染到螢幕上顯示.

深度緩衝區深度緩衝區(DEPTH_BUFFER)與幀緩衝區對應,用於記錄上面每個畫素的深度值,通過深度緩衝區,我們可以進行深度測試,從而確定畫素的遮擋關係,保證渲染正確.

模板緩衝區】模版緩衝(STENCIL_BUFFER)與深度緩衝大小相同,通過設定模版緩衝每個畫素的值,我們可以指定在渲染的時候只渲染某些畫素,從而可以達到一些特殊的效果.

1. 深度緩衝區

深度緩衝區原理就是把一個距離觀察平面(近裁剪面)的深度值(或距離)與視窗中的每個畫素相關聯。


1> 首先使用glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)來開啟DEPTH_BUFFER


void glutInitDisplayMode(unsigned int mode);
2>  每幀開始繪製時,須清空深度快取 glClear(GL_DEPTH_BUFFER_BIT); 該函式把所有畫素的深度值設定為最大值(一般是遠裁剪面)
3> 必要時呼叫glDepthMask(GL_FALSE)來禁止對深度緩衝區的寫入。繪製完後在呼叫glDepthMask(GL_TRUE)開啟DEPTH_BUFFER的讀寫(否則物體有可能顯示不出來)


     注意:只要存在深度緩衝區,無論是否啟用深度測試(GL_DEPTH_TEST),OpenGL在畫素被繪製時都會嘗試將深度資料寫入到緩衝區內,除非呼叫了glDepthMask(GL_FALSE)來禁止寫入。

2. 深度測試

    OpenGL中的深度測試是採用深度快取器演算法,消除場景中的不可見面。在預設情況下,深度快取中深度值的範圍在0.0到1.0之間1> 使用glEnable(GL_DEPTH_TEST)開啟深度測試

2> 每次繪製場景之前,需要先清除深度緩衝區,即glClear(GL_DEPTH_BUFFER_BIT),然後以任意次序繪製場景中的物體

3> glDepthRange (nearNormDepth, farNormalDepth);指定深度值範圍

這裡nearNormDepth和farNormalDepth可以取0.0到1.0範圍內的任意值,甚至可以讓nearNormDepth > farNormalDepth。這樣,通過glDepthRange函式可以在透視投影有限觀察空間中的任意區域進行深度測試。

4> glClearDepth (maxDepth);

引數maxDepth可以是0.0到1.0範圍內的任意值。glClearDepth用maxDepth對深度快取進行初始化,而預設情況下,深度快取用1.0進行初始化。由於在進行深度測試中,大於深度快取初始值的多邊形都不會被繪製,因此glClearDepth函式可以用來加速深度測試處理。這裡需要注意的是指定了深度快取的初始化值之後,應呼叫:glClear(GL_DEPTH_BUFFER_BIT);   完成深度快取的初始化。

5> glDepthFunc(func);

該函式用於指定將需要繪製的新畫素的z值與深度緩衝區中對應位置的z值進行比較的函式,如果比深度快取中的值小,那麼用新畫素的顏色值更新幀快取中對應畫素的顏色值。

引數func的值可以為GL_NEVER(沒有處理)、GL_ALWAYS(處理所有)、GL_LESS(小於)、GL_LEQUAL(小於等於)、GL_EQUAL(等於)、GL_GEQUAL(大於等於)、GL_GREATER(大於)或GL_NOTEQUAL(不等於),其中預設值是GL_LESS。這些測試可以在各種應用中減少深度快取處理的的計算。

啟動深度測試後,後面物體的繪製與前後關係就無關了,最後完成繪製後已經自動按照前後順序顯示了。

但是在繪製半透明物體時,深度測試就會出錯,你會發現最後繪製結果和想象中的不一樣。此時要用到glDepthMask和alpha blend。繪製前呼叫glDepthMask(GL_FALSE)(或者glDisable(GL_DEPTH_TEST)),開啟alpha blend,繪製完後在glDepthMask(GL_TRUE)

3. alpha blend

1> glEnable(GL_BLEND)
2> glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

參考:

http://blog.sina.com.cn/s/blog_4062094e01009iks.html

http://blog.csdn.net/lysc_forever/article/details/13614449

http://blog.163.com/jackie_howe/blog/static/199491347201231925236498/