opengl模板缓冲区
相信大家有些人對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.在這里我想通過這樣一個例子來說明一下:
?
// stencil2.cpp : 定義控制臺應用程序的入口點。 //#include "stdafx.h" #include <iostream> #include <assert.h> #include <GL/glew.h> #include <GL/glut.h>#pragma comment(lib, "glew32.lib")void init() {glClearColor(0,0,1.0,0);glClearStencil(0);glEnable(GL_STENCIL_TEST); }void display() {glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0, 0, -20);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 _tmain(int argc, _TCHAR* 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; }?
加入模板控制之后的結果:
?
// stencil2.cpp : 定義控制臺應用程序的入口點。 //#include "stdafx.h" #include <iostream> #include <assert.h> #include <GL/glew.h> #include <GL/glut.h>#pragma comment(lib, "glew32.lib")void init() {glClearColor(0,0,1.0,0);glClearStencil(0);glEnable(GL_STENCIL_TEST); }void display() {glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0, 0, -20);//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 _tmain(int argc, _TCHAR* 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; }運行結果:
?
?
轉載于:https://www.cnblogs.com/pangblog/p/3325053.html
總結
以上是生活随笔為你收集整理的opengl模板缓冲区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交通灯管理系统
- 下一篇: 动画演示 Delphi 2007 IDE