深入了解OpenGL 模板測試

2021-06-22 10:51:05 字數 1870 閱讀 1803

我們在用opengl繪圖時往往想製作一些復合圖形以及凹凸多邊形,像五角星、大的矩形裡再畫乙個小的矩形;另外有時還想做些鏤空圖或類似的效果。 這時我們可以開啟模板測試功能來完

我們在用opengl繪圖時往往想製作一些復合圖形以及凹凸多邊形,像五角星、大的矩形裡再畫乙個小的矩形;另外有時還想做些鏤空圖或類似的效果。

這時我們可以開啟模板測試功能來完成這些需求。

由於opengl的乙個繪製流水線特徵以及gpu著色特徵,像對於大矩形裡畫小矩形這種不能通過先繪製大矩形,然後再在其中繪製小矩形的方式進行繪製,否則當此復合圖形在做一些旋轉時,我們會發現小矩形部分會有非常嚴重的抖動。

模板測試的乙個基本的特性是:它基於在某個座標位置的模板快取值與乙個參考值相比較的結果,有條件地廢棄乙個片斷。這裡要注意的是,這個判定是基於當前被測試的片斷(而不是已在幀快取的畫素),並且當前片斷的每個畫素都會進行模板測試,並且如果某些畫素測試失敗的話,這些畫素就會被廢棄。

下面介紹一下如何開啟模板測試。

對於mac os x下,對你的opengl檢視的屬性中選擇模板快取的位數即可,模板快取只有8位這乙個選項。在ios的opengl es下,則需要建立乙個模板快取,建立方法與建立深度快取類似。

然後,我們在**中用glenable(gl_stencil_test);來開啟模板測試。

下面談談模板測試是如何工作的。一開始,我們用glclear(gl_stencil_buffer_bit);來清除模板快取的值,使這些值均為0(預設設定,也無須修改)。當我們用類似gldrawarrays這些函式來繪製某個圖形後,被繪製的圖形先被光柵化,然後得到相應的片斷。我們指定乙個參考值,乙個掩模值,跟當前的模板快取的值進行比較。

如何比較呢?下面給出一段偽**:

unsigned refvalue = inputreferencevalue & mask;

unsigned stencilvalue = currentstencilvalue & mask;

bool issuccessful = refvalue stencilvalue;

currentstencilvalue = updatestrategy(inputreferencevalue, currentstencilvalue, issuccessful);

我們首先用自己指定的參考值與掩模值進行按位與操作,得到的結果和當前對應的模板值與掩模值的按位與的結果進行比較,比較函式也由我們自己指定。如果比較的結果是true,即測試成功,當前的畫素被保留;否則,測試失敗,當前的畫素被廢棄。我們還可以指定在模板測試成功或失敗後如何更新模板值。

下面介紹上述操作過程所涉及到的一些介面:

void glstencilfunc(glenum  func, glint  ref, gluint  mask);

func是個列舉型別,它指定了比較操作,值可以是:gl_never, gl_less, gl_lequal, gl_greater, gl_gequal, gl_equal, gl_notequal, gl_always。ref就是參考值。而mask就是掩模值。如果模板位數是8的話,那麼mask最大值是0xff,即8個1;最小值是0。

void glstencilop(glenum  sfail, glenum  dpfail, glenum  ***ass);

這個函式指定了對模板值的更新操作。這三個引數所接受的列舉值都是同一組:gl_keep,gl_zero,gl_replace,gl_incr,gl_incr_wrap,gl_decr,gl_decr_wrap, gl_invert。sfail說明當模板測試失敗後,用何種方式更新模板值;dpfail說明當模板測試成功,但深度測試失敗後用何種方式更新模板值;***ass說明當模板測試與深度測試均成功後用何種方式更新模板值。gl_zero表示用0來更新模板值;gl_keep說明保留原來的模板值;gl_replace表明用參考值替代原來的模板值。

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

深入了解Dojo Data

譯自http www.sitepen.com blog 2010 10 13 dive into dojo data 使用dojo data有助於快速建立web應用的介面,且易於嵌入各種資料來源。它在使用者介面與底層資料之間提供了一層抽象層,使得使用者介面開發人員能夠專注於ui的開發,而無需擔心資料...