相信大家有些人對opengl的模板緩衝區不是很理解,包括我最開始也是,opengl的模板緩衝區其實就是採用過濾的技術來控制那些顏色可以繪製,那些不能進行繪製。這裡的過濾技術也就是我們的乙個控制方法,主要體現在如下兩個函式glstencilfunc(glenum func,glint ref,gluint mask)和glstencilop(glenum fail,glenum zfail, glenum zpass),其中
1.glstencilfunc中的第乙個引數指的是過濾函式,(如何來進行過濾),過濾函式有如下幾種型別
gl_never 從來不能通過
gl_always 永遠可以通過(預設值)
gl_less 小於參考值可以通過
gl_lequal 小於或者等於可以通過
gl_equal 等於通過
gl_gequal 大於等於通過
gl_greater 大於通過
gl_notequal 不等於通過
在這裡「通過」的意思指的是,我們在將圖元繪製到幀緩衝區的時候在片段進行測試的時候是可以完全透過去的,否則的話這個片段就無法繪製到對應的顏色幀緩衝區,那麼我們所
繪製的內容也就顯示不出來。通過這種控制方法來控制顯示,其實這種操作在我們實際的生活中也是很常見的,例如給汽車噴漆,蓋章(只會顯示刻了的內容)。
2.通過模板操作glstencil()來控制模板結果值的操作,例如,如果失敗了對模板值進行加1,減1等處理。等待下一次片段處理的時候再進行新的比較,對值的過濾做新的控制。
3.在這裡我想通過這樣乙個例子來說明一下:
4.可以通過呼叫glclearstencil()來設定清除(片段中)模板的初始化值,但是一定要記得呼叫glclear(gl_stencil_buffer_bit)來清除對應的緩衝位。
5.glstencilop(glenum fail,glenum zfail, glenum zpass) ;其中fail表示模板測試失敗的操作,zfail表示模板測試成功但深度測試失敗,zpass表示模板和深度測試也通過或者未執行深度或模板測試的情況。
// stencil2.cpp : 定義控制台應用程式的入口點。
加入模板控制之後的結果:
// stencil2.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include #include #include #pragma comment(lib, "glew32.lib")
void init()
void display()
glend();
glstencilfunc(gl_notequal,0x1,0x1);
glstencilop(gl_incr,gl_incr,gl_incr);//
glcolor3f(1.0f,0.0f,0.0f);
glrectf(-5,-5,5,5);
glutswapbuffers();
}void reshape(int w, int h)
int _tmain(int argc, _tchar* argv)
執行結果:
OpenGL模板緩衝區與模板測試
幀緩衝區有許多緩衝區構成,這些緩衝區大致分為 顏色緩衝區 用於繪圖的緩衝區,它包含了顏色索引或者rgba顏色資料。深度緩衝區 儲存每個畫素的深度值,當啟動深度 測試時,片段畫素深度值和深度緩衝區深度值進行比較,決定片段哪些畫素點資料可以替換到顏色緩衝區中。模板緩衝區 就像使用紙板和噴漆一樣精確的混圖...
OpenGL模板緩衝區與模板測試
幀緩衝區有許多緩衝區構成,這些緩衝區大致分為 顏色緩衝區 用於繪圖的緩衝區,它包含了顏色索引或者rgba顏色資料。深度緩衝區 儲存每個畫素的深度值,當啟動深度 測試時,片段畫素深度值和深度緩衝區深度值進行比較,決定片段哪些畫素點資料可以替換到顏色緩衝區中。模板緩衝區 就像使用紙板和噴漆一樣精確的混圖...
OpenGL緩衝區物件
opengl 緩衝區物件 今天學習了一下緩衝區物件.opengl是按照客戶機 伺服器模式設計的,在opengl需要資料的時候,都必須把資料從客戶機內傳輸到伺服器。緩衝區物件,允許應用程式現實的指定把哪些資料儲存在圖形伺服器。1.建立緩衝區物件 glgenbuffers opengl分配n個當前未使用...