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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java ui awt_java试用(3)awt,UI

importjava.awt.*;importjava.awt.event.*;publicclassMyFrameextendsFrame{privateTextField tf;publicstaticvoidmain(String args[ ]){MyFrame frnewMyFrame("Hello Out There!");fr.InitUI();}publicMyFrame (String str){super(str);//调用父类的构造方法}publi…

Linux php 中文乱码解决

在ubuntu下php网页输出乱码&#xff0c;在不涉及数据库编码的情况下&#xff1a; 修改“/etc/php5/apache2/php.ini”将 default_charset "iso-8859-1" 修改为default_charset "utf-8" 然后重启apache: sudo /etc/init.d/apache2 restart 推荐一个自己业…

vue在java中的应用_开发知识-Vue篇:在Vue应用中集成O2OA

在前面的章节中&#xff0c;我们介绍了两种在O2OA中使用Vue开发应用的方式&#xff0c;已经可以满足绝大多数的情况了。如果您考虑完全脱离O2的web服务器&#xff0c;自己搭建web服务器&#xff0c;那就请阅读本章。我们还是使用Vue的Vue-CLI工具&#xff0c;创建Vue应用&#…

java高性能低功耗计算_实现低功耗的高性能深度学习

对于大多数功耗敏感型的嵌入式视觉应用而言 , 搭载专用CNN引擎的视觉处理器可 能是能否满 足设计功 耗 预算的关键区别因素。选择专用CNN引擎似乎是一件理所应当的事情 , 但如何在芯片实现之前就测量 出 功 耗呢&#xff1f;我们假设一项应用的性能阈值对功耗预算有严格要求&am…

C++ 虚函数在基类与派生类对象间的表现及其分析

近来看了侯捷的《深入浅出MFC》&#xff0c;读到C重要性质中的虚函数与多态那部分内容时&#xff0c;顿时有了疑惑。因为书中说了这么一句&#xff1a;使用“基类之指针”指向“派生类之对象”&#xff0c;由该指针只能调用基类所定义的函数&#xff0c;如果要让基类的指针使用…

Android---什么是3G

学习安卓之前我们必须了解什么是3g.这几年随着IT技术的革新。移动互联网已经渐渐的占据了市场的主导地位。而3g技术是移动互联网的一方面体现。那么究竟什么是3g? 3G有三大制式&#xff0c;GSM升级后的WCDMA&#xff0c;CDMA升级后的CDMA2000&#xff0c;以及我国自主开发的TD…

centos7硬盘挂载mysql_centos7 挂载新磁盘

一 、挂载新磁盘查看磁盘[rootlocalhost ~]# fdisk -lDisk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectorsUnits sectors of 1 * 512 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk lab…

autolisp 列表 resbuf

有以下 list : (1 2 3 (4 5 6) "Properties" (("id" . 3) ("name" . "hello lisp"))) 要求用: quote cons acutBuildList acutNewRb 方式构造 转载于:https://www.cnblogs.com/pangblog/p/3331246.html

如何看懂php源程序,概述 · thinkphp5.0 源码阅读学习 · 看云

**1 章节简介**概述: 记录框架的文件&#xff0c;类&#xff0c;函数或方法等索引到文章的具体章节&#xff0c;方便查找。框架流程&#xff1a;框架流程的重要文件分析。框架工具&#xff1a;框架自带的重要工具文件分析。框架驱动&#xff1a;框架底层的驱动与扩展目录分析。…

php评论盖楼怎么实现,dedecms评论盖楼实现楼层数,类似腾讯、网易的评论(5.5/5.6版)...

DEDE评论效果&#xff1a;修改后的效果&#xff1a;修改步骤一、织梦dedecms5.5版本(5.6版本请往下看)1、修改/plus/feedback_ajax.php文件的第131行(如果你没改过)下面是修改之前的代码&#xff1a;$qmsg {quote}{title}.$row[username]. 的原帖&#xff1a;{/title}{content…

Nokia 920全部CODE

code码都是7位&#xff0c;我是从别的地方copy过来的&#xff0c;code码后面带了些乱码懒得删了&#xff0c;自己数7位code就是了。 RM-820 NDT AMERICA ATT White 059N5T3RM-820 NDT AMERICA ATT Yellow 059N5T5RM-820 NDT AMERICA ATT Black 059L848RM-…

datagridview绑定与详细说明 (搜集)

1、实现一个用于处理数据库教程数据检索的详细信息的方法。 下面的代码示例实现一个 getdata 方法&#xff0c;该方法对一个 sqldataadapter 组件进行初始化&#xff0c;并使用该组件填充 datatable。 然后&#xff0c;将 datatable 绑定到 bindingsource 组件。请确保将 conne…

matlab显示二值直方图,图像灰度变换、二值化、直方图

1、灰度变换1)灰度图的线性变换Gnew Fa * Gold Fb。Fa为斜线的斜率&#xff0c;Fb为y轴上的截距。Fa>1 输出图像的对比度变大&#xff0c;否则变小。Fa1 Fb≠0时&#xff0c;图像的灰度上移或下移&#xff0c;效果为图像变亮或变暗。Fa-1&#xff0c;Fb255时&#xff0c;发…

Delphi XE2 之 FireMonkey 入门(13) - 动画(下)

TAnimation 类的主要成员: protectedfunction NormalizedTime: Single; //procedure ProcessAnimation; virtual; //其子类们主要通过覆盖此方法来实现不同的动画procedure Loaded; override; // publicprocedure Start; virtual; //播放procedure…

mysql 触发器 插入或者更新,MySQL 在触发器里中断记录的插入或更新?

下面是一种实现的方法。思路就是想办法在触发器中利用一个出错的语句来中断代码的执行。mysql> create table t_control(id int primary key);Query OK, 0 rows affected (0.11 sec)mysql> insert into t_control values (1);Query OK, 1 row affected (0.05 sec)mysql&g…