使用『模板緩存』可以將屏幕中的某些部分從視野中屏蔽.其中的特效是『鏡像』效果.鏡像(倒影)演示程式:下載
1.設置像素格式時對PIXELFORMATDESCRIPTOR對cStencilBits設置為 16bit『模板緩存』.
PIXELFORMATDESCRIPTOR pdf;
pfd.cStencilBits = 16;
2.要啟用『模板緩存』
glEnable(GL_STENCIL_TEST);
3.設置模板操作
void glStencilOp(GLenum fail,GLenum zfail,GLenum zpass);
fail:模板測試失敗
zfail:模板測試通過,但深度測試失敗
zpass:模板測試與深度測試均通過
操作 | 簡介 |
GL_KEEP | 保持當前值 |
GL_ZERO | 將模板緩存的值設定為0 |
GL_REPLACE | 將模板緩存的值設定為glStencilFunc()的參考值ref. |
GL_INCR | 增加當前模板的緩存值 |
GL_DECR | 減小當前模板的緩存值 |
GL_INVERT | 將模板緩存的值反轉 |
4.設置模板比較程序
void glStencilFunc(GLenum func,GLint ref,GLuint mask);
func:比較程式
ref:參考值
mask:模板掩碼
比較程式 | 簡介 |
GL_NEVER | 總是失敗 |
GL_LESS | 條件比較:if (ref & mask) < (stencil & mask). |
GL_LEQUAL | 條件比較:if (ref & mask) ≤ (stencil & mask). |
GL_GREATER | 條件比較:if (ref & mask) > (stencil & mask). |
GL_GEQUAL | 條件比較: if (ref & mask) ≥ (stencil & mask). |
GL_EQUAL | 條件比較: if (ref & mask) = (stencil & mask). |
GL_NOTEQUAL | 條件比較: if (ref & mask) ≠ (stencil & mask). |
GL_ALWAYS | 總是允許 |
繪畫鏡像函式代碼演示:
1.禁用深度測試
glDisable(GL_DEPTH_TEST);
2.禁用對所有的然色分量的修改
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
3.啟用模板測試
glEnable(GL_STENCIL_TEST);
4.將地板繪製到模板緩存中,引用參考值ref
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
glStencilFunc(GL_ALWAYS, 1, 1);
5.繪畫地板後雖然還未睇到地板,但已在模板緩存中生成孔,在孔中的多邊形將不被繪製
Draw_Floor();
6.啟用所有顏色分量的修改
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
7.啟用深度測試
glEnable(GL_DEPTH_TEST);
8.設置模板比較程序,只能在模板緩存中值為1的相應去區域繪製
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
9.壓入模型矩陣.準備繪製”鏡像”
glPushMatrix();
10.返轉境像
glScalef(1.0f, -1.0f, 1.0f);
11.繪畫鏡像(倒影)
Draw_Mirror();
11.彈出模型矩陣結束鏡像繪製
PopMatrix();
12.禁用模板測試
glDisable(GL_STENCIL_TEST);
13.以50%繪製透明地板, 啟用混合
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1.0f,1.0f,1.0f,0.5f);
14.繪畫地板
Draw_Floor();
15.禁用混合
glDisable(GL_BLEND);