2015-11-05 107 views
1

我在使用mac上的OpenGL中的模板測試進行繪圖時遇到了問題。當我第一次畫場景時,模板工作正常。我在中間繪製了一個半透明的黑色矩形,寫入啓用的模板緩衝區,然後更大的藍色矩形寫入模板緩衝區。我得到正確的結果,當窗口首先彈出,它看起來像這樣:在OpenGL中更新模板緩衝區時的問題

Correct (Initial) Render

然而,當我調整窗口的大小,並繪製函數被再次調用,我得到一個結果,它看起來像:

Issue Example #1Issue Example #2

有時怪異的空白遵循中間的矩形,其他時間似乎是隨機安排的白色卡扣,但是當你回到那個窗口大小保持這些安排。我無法找到這個在線的解決方案。這裏是我的渲染功能,這就是所謂的窗口大小任意時間:

glClearColor(0, 0, 0, 1); 
glClearStencil(0x00); 
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

// Replace data in the stencil buffer with 1s if it passes the test 
// which should be GL_ALWAYS 
glStencilFunc(GL_ALWAYS, 1, 0xFF); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

// Allow data to be written to the stencil buffer. 
glStencilMask(0xFF); 

p->fillSquare(1, 1, 1, 0.3, -0.25, 0.25, 0.25, 0.25, -0.25, -0.25, 0.25, -0.25); // Write a semi transparent black rectangle 

glStencilMask(0x00); // Disable writing to the stencil buffer. 
glStencilFunc(GL_NOTEQUAL, 1, 0xFF); // Only draw if stencil value is 1. 

// Draw blue rectangle 
p->fillSquare(0.60, 0.60, 0.80, 1, -0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5); 

glfwSwapBuffers(w); 

在你想知道的情況下,p->fillRect()需要四個浮標爲矩形的RGBA顏色,然後在x和y各自的座標頂點。

看來清理模板可能存在某種問題,但我真的不能確定。我的OpenGL初始化函數中打開了模板測試。 如果您需要了解有關我的代碼或系統的其他方面的其他信息,請隨時發表評論。

注意:我沒有使用OpenGL的深度,所以可以不清除深度緩衝區(我測試過了)。

回答

4

模板緩衝區的清除確實無法如您所期望的那樣工作(除了第一次調用funtion)。

您錯過的是glStencilMask也會影響glClear(... | GL_STENCIL_BUFFER_BIT)。 在進行清除呼叫之前,您應該稍微移動glStencilMask(0xFF)