相信大家有些人对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.在这里我想通过这样一个例子来说明一下:

  1. // stencil2.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <assert.h>
  7. #include <GL/glew.h>
  8. #include <GL/glut.h>
  9.  
  10. #pragma comment(lib, "glew32.lib")
  11.  
  12. void init()
  13. {
  14. glClearColor(0,0,1.0,0);
  15. glClearStencil(0);
  16. glEnable(GL_STENCIL_TEST);
  17. }
  18.  
  19. void display()
  20. {
  21. glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  22.  
  23. glLoadIdentity();
  24. glTranslatef(0, 0, -20);
  25.  
  26. glStencilFunc(GL_ALWAYS, 0,0x00);
  27. //glStencilFunc(GL_NEVER,0x0,0x0);
  28. //glStencilOp(GL_INCR,GL_INCR,GL_INCR);//
  29.  
  30. glColor3f(1.0f,1.0f,1.0f);
  31.  
  32. float dRadius = 5.0*(sqrt(2.0)/2.0);
  33. glBegin(GL_LINE_STRIP);
  34. for (float dAngel=0;dAngel<380.0;dAngel+=0.1)
  35. {
  36. glVertex2d(dRadius*cos(dAngel),dRadius*sin(dAngel));
  37. dRadius*=1.003;
  38. }
  39. glEnd();
  40.  
  41. //glStencilFunc(GL_NOTEQUAL,0x1,0x1);
  42. //glStencilOp(GL_INCR,GL_INCR,GL_INCR);//
  43.  
  44. glColor3f(1.0f,0.0f,0.0f);
  45. glRectf(-5,-5,5,5);
  46.  
  47. glutSwapBuffers();
  48. }
  49.  
  50. void reshape(int w, int h)
  51. {
  52. glViewport(0,0,w,h);
  53. float aspect = (w*1.0)/h;
  54.  
  55. glMatrixMode(GL_PROJECTION);
  56. glLoadIdentity();
  57. gluPerspective(60, aspect, 1, 100);
  58.  
  59. glMatrixMode(GL_MODELVIEW);
  60. glLoadIdentity();
  61. }
  62.  
  63. int _tmain(int argc, _TCHAR* argv[])
  64. {
  65. glutInit(&argc, argv);
  66. glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_STENCIL);
  67. glutInitWindowPosition(200,200);
  68. glutInitWindowSize(600,600);
  69. glutCreateWindow(argv[0]);
  70.  
  71. assert(GLEW_NO_ERROR == glewInit());
  72.  
  73. init();
  74. glutReshapeFunc(reshape);
  75. glutDisplayFunc(display);
  76. glutMainLoop();
  77.  
  78. return 0;
  79. }

加入模板控制之后的结果:

  1. // stencil2.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <assert.h>
  7. #include <GL/glew.h>
  8. #include <GL/glut.h>
  9.  
  10. #pragma comment(lib, "glew32.lib")
  11.  
  12. void init()
  13. {
  14. glClearColor(0,0,1.0,0);
  15. glClearStencil(0);
  16. glEnable(GL_STENCIL_TEST);
  17. }
  18.  
  19. void display()
  20. {
  21. glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  22.  
  23. glLoadIdentity();
  24. glTranslatef(0, 0, -20);
  25.  
  26. //glStencilFunc(GL_ALWAYS, 0,0x00);
  27. glStencilFunc(GL_NEVER,0x0,0x0);
  28. glStencilOp(GL_INCR,GL_INCR,GL_INCR);//
  29.  
  30. glColor3f(1.0f,1.0f,1.0f);
  31.  
  32. float dRadius = 5.0*(sqrt(2.0)/2.0);
  33. glBegin(GL_LINE_STRIP);
  34. for (float dAngel=0;dAngel<380.0;dAngel+=0.1)
  35. {
  36. glVertex2d(dRadius*cos(dAngel),dRadius*sin(dAngel));
  37. dRadius*=1.003;
  38. }
  39. glEnd();
  40.  
  41. glStencilFunc(GL_NOTEQUAL,0x1,0x1);
  42. glStencilOp(GL_INCR,GL_INCR,GL_INCR);//
  43.  
  44. glColor3f(1.0f,0.0f,0.0f);
  45. glRectf(-5,-5,5,5);
  46.  
  47. glutSwapBuffers();
  48. }
  49.  
  50. void reshape(int w, int h)
  51. {
  52. glViewport(0,0,w,h);
  53. float aspect = (w*1.0)/h;
  54.  
  55. glMatrixMode(GL_PROJECTION);
  56. glLoadIdentity();
  57. gluPerspective(60, aspect, 1, 100);
  58.  
  59. glMatrixMode(GL_MODELVIEW);
  60. glLoadIdentity();
  61. }
  62.  
  63. int _tmain(int argc, _TCHAR* argv[])
  64. {
  65. glutInit(&argc, argv);
  66. glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_STENCIL);
  67. glutInitWindowPosition(200,200);
  68. glutInitWindowSize(600,600);
  69. glutCreateWindow(argv[0]);
  70.  
  71. assert(GLEW_NO_ERROR == glewInit());
  72.  
  73. init();
  74. glutReshapeFunc(reshape);
  75. glutDisplayFunc(display);
  76. glutMainLoop();
  77.  
  78. return 0;
  79. }

运行结果:

opengl模板缓冲区的更多相关文章

  1. OpenGL模板缓冲区与模板测试

    原文地址:http://www.blogjava.net/qileilove/archive/2014/01/23/409269.html 帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区: ...

  2. windows屏幕保护程序opengl模板

    Visual Studio 2013 屏幕保护程序opengl模板 ScreenSaver.cpp #define VC_EXTRALEAN #include <windows.h> #i ...

  3. [译]OpenGL像素缓冲区对象

    目录概述创建PBO映射PBO例子:Streaming Texture Uploads with PBO例子:Asynchronous Readback with PBO 概述 OpenGL ARB_p ...

  4. OpenGL顶点缓冲区对象

    [OpenGL顶点缓冲区对象] 显示列表可以快速简单地优化立即模式(glBegin/glEnd)的代码.在最坏的情况下,显示列表的命令被预编译存到命令缓冲区中,然后发送给图形硬件.在最好的情况下,是编 ...

  5. OpenGL顶点缓冲区对象(VBO)

    转载 http://blog.csdn.net/dreamcs/article/details/7702701 创建VBO        GL_ARB_vertex_buffer_object 扩展可 ...

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

    自己经常使用的一些功能做一个模板,有灯光效果,你可以用鼠标放大,围绕所述旋转坐标系的原点 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHlhbmcxOT ...

  7. openGL深度缓冲区问题

    http://zhidao.baidu.com/question/368299839.html&__bd_tkn__=6aa9196c746cd3357f1eec74aeb127b395029 ...

  8. opengl 模板测试 glStencilOp glStencilFunc

    下面来设置蒙板缓存和蒙板测试. 首先我们启用蒙板测试,这样就可以修改蒙板缓存中的值. 下面我们来解释蒙板测试函数的含义: 当你使用glEnable(GL_STENCIL_TEST)启用蒙板测试之后,蒙 ...

  9. OpenGL(十四) 模板测试

    启用模板测试时,OpenGL会在内存中开辟一块空间作为模板缓冲区,里边保存了每个像素的"模板值",模板测试的过程就是把每一个像素的模板值与一个设定的模板参考值进行比较,符合设定条件 ...

随机推荐

  1. 解决“无法连接到Python代码运行助手。请检查本机的设置”问题

    廖雪峰老师python课程里有个代码运行助手,可以让你在线输入Python代码,然后通过本机运行的一个Python脚本来执行代码,很方便的一个脚本工具,但是很多人用过之后出现了这样的提示:“无法连接到 ...

  2. sql语句操作记录

    发觉一些sql语句写出来的时候不停忘记,做一个记录. mySQL .查看表的创建过程sql语句和注释,注释是在创建表的过程中增加comment,后面跟随注释的内容 SHOW CRATE TABLE T ...

  3. zookeeper 学习笔记 (C语言版本)

    1.zookeeper简介 zookeeper是Hadoop的子项目,在大型分布式系统中,zookeeper封装好了一些复杂易出错的服务,提供简单易用的接口,给使用者提供高效稳定的服务.这些服务包括配 ...

  4. 帝国cms内容页模版

    <title>[!--pagetitle--]</title> <meta name="keywords" content="[!--pag ...

  5. android:configChanges 屏幕横竖屏切换

    出处:http://blog.csdn.net/djy1992/article/details/9378195 --->  android:screenOrientation="por ...

  6. Paxos算法小结

    转自不正直的绅士,因百度空间迁移,无法注明出处,我从其google搜索引擎中的cache进行的copy. 不正直的绅士 是跟我一起工作过的非常有才的一个青年才俊. Paxos的使用非常广泛.sanlo ...

  7. display的table和cell外加table-layout:fixed等分布局,外加换行,word-wrap:break-word

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Android重启应用程序代码

    Intent i = getBaseContext().getPackageManager() .getLaunchIntentForPackage(getBaseContext().getPacka ...

  9. android基础5——使用资源

    Android会基于当前的硬件.设备和语言配置来为某个资源标识符选择最合适的值. 1.在代码中使用资源 使用静态类R来访问资源.R类是基于外部资源而生的类,并且是在项目编译的时候创建的.R的每一个子类 ...

  10. asp.net DropDownList实现ToolTip功能

    在绑定DropDownList控件时,可能出现绑定显示的文本过长以至于超过控件长度的内容看不到,这时候就需要使用ToolTip完成其功能,即鼠标放到相应选项后就可显示其完成内容. 首先,在页面引入jQ ...