相信你們有些人對OpenGL的模板緩衝區不是很理解,包括我最開始也是,OpenGL的模板緩衝區其實就是採用過濾的技術來控制那些顏色能夠繪製,那些不能進行繪製。這裏的過濾技術也就是咱們的一個控制方法,主要體如今以下兩個函數glStencilFunc(GLenum func,GLint ref,GLuint mask)和glStencilOp(GLenum fail,GLenum zfail, GLenum zpass),其中 ios
1.glStencilFunc中的第一個參數指的是過濾函數,(如何來進行過濾),過濾函數有以下幾種類型 函數
GL_NEVER 歷來不能經過 oop
GL_ALWAYS 永遠能夠經過(默認值) 測試
GL_LESS 小於參考值能夠經過 ui
GL_LEQUAL 小於或者等於能夠經過 spa
GL_EQUAL 等於經過 .net
GL_GEQUAL 大於等於經過 code
GL_GREATER 大於經過 blog
GL_NOTEQUAL 不等於經過 ip
在這裏「經過」的意思指的是,咱們在將圖元繪製到幀緩衝區的時候在片斷進行測試的時候是能夠徹底透過去的,不然的話這個片斷就沒法繪製到對應的顏色幀緩衝區,那麼咱們所繪製的內容也就顯示不出來。經過這種控制方法來控制顯示,其實這種操做在咱們實際的生活中也是很常見的,例如給汽車噴漆,蓋章(只會顯示刻了的內容)。
2.經過模板操做glStencil()來控制模板結果值的操做,例如,若是失敗了對模板值進行加1,減1等處理。等待下一次片斷處理的時候再進行新的比較,對值的過濾作新的控制。
3.在這裏我想經過這樣一個例子來講明一下:
- #include <math.h>
- #include <iostream>
- #include <assert.h>
-
- #include <GL/glut.h>
- #pragma comment(lib, "glut32.lib")
- // #include <GL/glew.h>
- // #pragma comment(lib, "glew32.lib")
-
- void init()
- {
- glClearColor(0.0, 0.0, 1.0, 0.0);
- glClearStencil(0);
- glEnable(GL_STENCIL_TEST);
- }
-
- void display()
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
-
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -20.0);
-
- glStencilFunc(GL_ALWAYS, 0, 0x00);
- //glStencilFunc(GL_NEVER, 0x0, 0x0);
- //glStencilOp(GL_INCR, GL_INCR, GL_INCR);//
-
- glColor3f(1.0f, 1.0f, 1.0f);
-
- float dRadius = 5.0 * (sqrt(2.0) / 2.0);
- glBegin(GL_LINE_STRIP);
- for (float dAngel = 0; dAngel < 380.0; dAngel += 0.1)
- {
- glVertex2d(dRadius * cos(dAngel), dRadius * sin(dAngel));
- dRadius *= 1.003;
- }
- 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)
- {
- glViewport(0, 0, w, h);
- float aspect = (w * 1.0) / h;
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(60, aspect, 1, 100);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
-
- int main(int argc, char* argv[])
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_STENCIL);
- glutInitWindowPosition(200,200);
- glutInitWindowSize(600,600);
- glutCreateWindow(argv[0]);
-
- // assert(GLEW_NO_ERROR == glewInit());
-
- init();
- glutReshapeFunc(reshape);
- glutDisplayFunc(display);
- glutMainLoop();
-
- return 0;
- }
加入模板控制以後的結果:
- #include <math.h>
- #include <iostream>
- #include <assert.h>
-
- #include <GL/glut.h>
- #pragma comment(lib, "glut32.lib")
- // #include <GL/glew.h>
- // #pragma comment(lib, "glew32.lib")
-
- void init()
- {
- glClearColor(0.0, 0.0, 1.0, 0.0);
- glClearStencil(0);
- glEnable(GL_STENCIL_TEST);
- }
-
- void display()
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
-
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -20.0);
-
- //glStencilFunc(GL_ALWAYS, 0, 0x00);
- glStencilFunc(GL_NEVER, 0x0, 0x0);
- glStencilOp(GL_INCR, GL_INCR,GL_INCR);//
-
- glColor3f(1.0f, 1.0f, 1.0f);
-
- float dRadius = 5.0 * (sqrt(2.0) / 2.0);
- glBegin(GL_LINE_STRIP);
- for (float dAngel = 0; dAngel < 380.0; dAngel += 0.1)
- {
- glVertex2d(dRadius * cos(dAngel), dRadius * sin(dAngel));
- dRadius *= 1.003;
- }
- glEnd();
-
- glStencilFunc(GL_NOTEQUAL, 0x1, 0x1);
- glStencilOp(GL_INCR, GL_INCR, GL_INCR);//
-
- glColor3f(1.0f, 0.0f, 0.0f);
- glRectf(-5.0, -5.0, 5.0, 5.0);
-
- glutSwapBuffers();
- }
-
- void reshape(int w, int h)
- {
- glViewport(0, 0, w, h);
- float aspect = (w * 1.0) / h;
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(60.0, aspect, 1.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
-
- int main(int argc, char* argv[])
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_STENCIL);
- glutInitWindowPosition(200, 200);
- glutInitWindowSize(600, 600);
- glutCreateWindow(argv[0]);
-
- // assert(GLEW_NO_ERROR == glewInit());
-
- init();
- glutReshapeFunc(reshape);
- glutDisplayFunc(display);
- glutMainLoop();
-
- return 0;
- }