相信大家有些人对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模板缓冲区相关推荐

  1. OPenGL模板缓冲区示例程序

    模板测试是把像素存储在模板缓冲区的值与一个参考值进行比较.根据测试的结果,对模板缓冲区中得这个值进行相应的修改. Note:模板测试只有在存在模板缓冲区的情况下才会执行,如果不存在模板缓冲区,模板测试 ...

  2. OpenGL使用模板缓冲区和剪切平面

    OpenGL使用模板缓冲区和剪切平面 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include " ...

  3. OpenGL学习二十九:模板缓冲区与模板测试

    帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据. 深度缓冲区:存储每个像素的深度值,当启动深度测试时,片段像素深度值和深度缓冲区深度 ...

  4. OpenGL模板测试通俗理解

    看书籍或资料往往还是云里雾里的,这里写一下自己的理解.希望对需要的人有帮助. 简而言之: 模板缓冲区和帧缓冲区一样大 模板缓冲区初始状态是什么? 在glClearBuffer的时候清空,所以初始状态是 ...

  5. 【D3D11游戏编程】学习笔记十八:模板缓冲区的使用、镜子的实现

    (注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 模板缓冲区(Stencil Buffe ...

  6. OpenGL模板 Mac Cmake OpenGL(Glut) Template

    自己经常使用的一些功能做一个模板,有灯光效果,你可以用鼠标放大,围绕所述旋转坐标系的原点 Main.cpp #include <GLUT/glut.h> #include <cstd ...

  7. OpenGL 帧缓冲区

    帧缓冲区 几乎每个图形程序的重要目标之一都是在屏幕上绘制图形.屏幕是由一个矩形像素数组组成的,每个像素都可以在图像的某一个点上显示一个某种颜色的微小方块.在光栅化阶段(包括纹理和雾)之后,数据就不再是 ...

  8. opengl模板测试实例

    在opengl中, 可以开启模板测试功能,来限定某一部分是可画的,某一部分是不可画的.这可通过设置模板模式来控制哪部分是可画的, 有点类似在墙上喷字. 虽说剪刀测试也可以限定蓝屏的某一部分可画,但不适 ...

  9. C++ opengl 深度缓冲区

    GL_DEPTH_BUFFER_BIT 每一次清除之前,都要清空深度缓冲区 启动深度测试glEnable(GL_DEPTH_TEST):离视野近的物体会挡住离视野远的物体. 运行截图如下: 源码如下: ...

最新文章

  1. WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebService
  2. PL/SQL Developer 和 instantclient客户端快速安装配置(图文)
  3. Socket阻塞与非阻塞,同步与异步、I/O模型
  4. MongoDB最简单的入门教程之四:使用Spring Boot操作MongoDB
  5. 如何成为一名优秀的高级C/C++程序员
  6. Python机器学习:梯度下降法007使用scikit中的随机梯度下降法
  7. ArcGIS Runtime for Android开发教程V2.0(9)基础篇-----查询检索
  8. oracle 等待原因查找,查询引起锁等待的SQL语句
  9. 腾讯开源物联网操作系统 TencentOS tiny,最小体积 1.8KB!
  10. Android Studio配置文件修改
  11. Asp.Net中WebApi多图片上传(附前后端代码)
  12. 边缘检测之Sobel算子Prewitt算子
  13. 山东理工 ACM [1011] A+B for Input-Output Practice (II)
  14. 学习笔记 C++ 动态数组类的声明
  15. 深圳十大绝美看海圣地|深圳海边一日游攻略
  16. Windows防火墙添加禁用规则——以禁用微信为例
  17. 微信小程序--优购商城项目(4)
  18. 使用element-ui使用表格展示微信头像
  19. 应用Druid监控SQL语句的执行情况
  20. 畅想物联网安全未来,几维安全让万物互联更安全

热门文章

  1. uni-app小程序本地打包超过2M不能预览问题;小程序打包过大不能预览和真机调试;uni-app分包;
  2. [react-router] React-Router的路由有几种模式?
  3. 前端学习(3097):vue+element今日头条管理-回顾
  4. 54失败是成功之母二
  5. 工作209:整理订单的重置逻辑
  6. 工作109:token要登录之后才有
  7. 前端学习(2562):v-loading
  8. 前端学习(2064):vue的生命周期函数有什么
  9. 前端学习(2054)vue.js课程介绍
  10. 前端学习(2051)vue之电商管理系统电商系统之开启gzip文件传输