OpenGL模板缓冲区与模板测试_weixin_34220963的博客-程序员ITS201

帧缓冲区有许多缓冲区构成,这些缓冲区大致分为:
  颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据。
  深度缓冲区:存储每个像素的深度值,当启动深度 测试时,片段像素深度值和深度缓冲区深度值进行比较,决定片段哪些像素点数据可以替换到颜色缓冲区中。
  模板缓冲区:就像使用纸板和喷漆一样精确的混图一样,当启动 模板测试时,通过模板测试的片段像素点会被替换到颜色缓冲区中,从而显示出来,未通过的则不会保存到颜色缓冲区中,从而达到了过滤的功能。
  累积缓冲区:累积缓冲区允许你把渲染到颜色缓冲区的值,拷贝到累积缓冲区。在多次拷贝操作到累积缓冲区时,可以用不同方式的把颜色缓冲区内容和当前累积缓冲区的内容进行重复混合
   模板测试
  模板测试只有存在模板缓冲区的情况下进行,模板测试把像素存储在模板缓冲区的点与一个参考值进行比较(glStencilFunc),根据测试结果,对模板缓冲区的值进行响应的修改glStencilOp
  void glStencilFunc (GLenum func, GLint ref, GLuint mask);
  func:GL_NEVER 从来不能通过
  GL_ALWAYS 永远可以通过(默认值)
  GL_LESS 小于参考值可以通过
  GL_LEQUAL 小于或者等于可以通过
  GL_EQUAL 等于通过
  GL_GEQUAL 大于等于通过
  GL_GREATER 大于通过
  GL_NOTEQUAL 不等于通过
  ref: 参考值
  mask:掩码,书上说模板测试只在哪些对应为1的位上进行。(不是很确定具体作用)
  举例:glStencilFunc (GL_LESS, 1.0, 1.0);模板缓冲区对应的像素点的值如果小于1.0,则通过模板测试
  void glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
  fail模板测试未通过时该如何变化;zfail表示模板测试通过,但深度测试未通过时该如何变化;zpass表示模板测试和深度测试或者未执行深度测试均通过时该如何变化
  GL_KEEP(不改变,这也是默认值)
  GL_ZERO(回零)
  GL_REPLACE(使用测试条件中的设定值来代替当前模板值)
  GL_INCR(增加1,但如果已经是最大值,则保持不变),
  GL_INCR_WRAP(增加1,但如果已经是最大值,则从零重新开始)
  GL_DECR(减少1,但如果已经是零,则保持不变),
  GL_DECR_WRAP(减少1,但如果已经是零,则重新设置为最大值)
  GL_INVERT(按位取反)
   未启用模板缓冲区
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, -20);
glColor3f(1.0f,1.0f,1.0f);
dRadius = 5.0*(sqrt(2.0)/2.0);
glBegin(GL_LINE_STRIP);
for (dAngel=0;dAngel<380.0;dAngel+=0.1)
{
glVertex2d(dRadius*cos(dAngel),dRadius*sin(dAngel));
dRadius*=1.003;
}
glEnd();
glColor3f(1.0f,0.0f,0.0f);
glRectf(-5,-5,5,5);

初始清除背景填充颜色为蓝色
  以上这部分代码可以用如下3张图表示绘制的过程
   开启模板缓冲区
void init()
{
glClearColor(0,0,1.0,0);
glClearStencil(0);
glClearDepth(1.0f);
glEnable(GL_STENCIL_TEST);
}
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);//1
glLoadIdentity();
glTranslatef(0, 0, -20);
glStencilFunc(GL_NEVER,0x0,0xFF);  //2
glStencilOp(GL_INCR,GL_INCR,GL_INCR);//3
glColor3f(1.0f,1.0f,1.0f);
dRadius = 5.0*(sqrt(2.0)/2.0);
glBegin(GL_LINE_STRIP);
for (dAngel=0;dAngel<380.0;dAngel+=0.1)
{
glVertex2d(dRadius*cos(dAngel),dRadius*sin(dAngel));
dRadius*=1.003;
}
glEnd();
glStencilFunc(GL_NOTEQUAL,0x1,0xFF);  //4
glStencilOp(GL_KEEP,GL_KEEP,KEEP); //5
glColor3f(1.0f,0.0f,0.0f);
glRectf(-5,-5,5,5);
  当执行到1处,3个缓冲区都被清空
  颜色缓冲区:每个像素点颜色都是蓝色
  深度缓冲区:每个像素点深度都是1.0
  模板缓冲区:每个像素点模板值都是0
  执行到2,3处,模板测试条件是从不通过测试,如果不通过测试结果是模板值+1
  接着应用模板测试进行绘制一组点,由于模板测试条件是从不通过测试,所以颜色缓冲器值不会变化,但是绘制的点对应的像素点的模板值变为1,此时
  颜色缓冲区:每个像素点颜色都是蓝色
  深度缓冲区:每个像素点深度都是1.0
  模板缓冲区:点数组对应的模板值是1,其他区域像素点的模板值还是0
  执行到4,5处,模板测试条件是模板值不一定1则通过测试,如果不通过测试结果是模板值+1
  接着应用刚才的模板测试进行绘制一个(-5,-5,5,5)的矩形,在这个矩形区域内,像素点的模板值分为2中,值为1的是上1步的点数组。值为0的是上一步非的点数组像素点。那个根据模板测试条件,模板值为0的像素点通过测试,可以进行替换颜色缓冲区的值(替换成红色),模板值为0的像素点不能通过测试,因此不能改变颜色缓冲区的值
  颜色缓冲区:(-5,-5,5,5)区域内 模板值为0的像素点为红色,其他区域都为蓝色
  深度缓冲区:每个像素点深度都是1.0
  模板缓冲区:点数组对应的模板值是1,其他区域像素点的模板值还是0
模板查询
  可以用glGetInteger函数获取与模板相关的参数值
#include "header.h"
float dRadius =0;
float dAngel;
float aspect=0;
void init()
{
glClearColor(0,0,1.0,0);
glClearStencil(0);
glClearDepth(1.0f);
glEnable(GL_STENCIL_TEST);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, -20);
glStencilFunc(GL_ALWAYS, 0,0x00);
glStencilFunc(GL_NEVER,0x0,0xFF);
glStencilOp(GL_INCR,GL_INCR,GL_INCR);
glColor3f(1.0f,1.0f,1.0f);
dRadius = 5.0*(sqrt(2.0)/2.0);
glBegin(GL_LINE_STRIP);
for (dAngel=0;dAngel<380.0;dAngel+=0.1)
{
glVertex2d(dRadius*cos(dAngel),dRadius*sin(dAngel));
dRadius*=1.003;
}
glEnd();
glStencilFunc(GL_NOTEQUAL,0x1,0xFF);
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);
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);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_STENCIL|GLUT_DEPTH);
glutInitWindowPosition(200,200);
glutInitWindowSize(600,600);
glutCreateWindow("模板缓冲区与模板测试");
glewInit();
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

最新内容请见作者的GitHub页:http://qaseven.github.io/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34220963/article/details/90492105

智能推荐

Navicat MySQL的安装配置_北大山泉的博客-程序员ITS201

一、装一个Navicat for mac按这个来!参考文章:https://www.52pojie.cn/thread-727433-1-1.html直接下载现成的。就装上了。也有像这样先下原版12.0.22(再新的版本就无法破解了)再手动破解的,但我卡在了请求码界面出不来…,醉了https://blog.csdn.net/xhd731568849/article/details/...

Flink学习笔记(6)——时间语义与Wartmark及EventTime在Window中的使用_颍天的博客-程序员ITS201

文章目录前言WatermarkWatermark的概念前言上一章我们学习了窗口,理想状态下的流式数据是按照发生的时间先后依次排序输入,下游在消费的时候也是按照时间顺序依次取出。但是在实际生产中,数据往往会因为各种原因而乱序,例如网络抖动、服务器故障之类的。这时候就需要Watermark发挥作用了。WatermarkWatermark的概念watermark是一种衡量Event Time进展的机制,它是数据本身的一个隐藏属性。通常基于Event Time的数据,自身都包含一个timestamp,例如

大教堂与集市(The Cathedral and the Bazaar)读书笔记_weixin_34221112的博客-程序员ITS201

大教堂与集市The Cathedral and the Bazaar,一本不像计算机方面的计算机书籍命令式管理,适合和奴隶共事目标共识型管理,适合和自由人共事心性气层只要眼多,bug好找黑客开源:产品相关富足,赢得尊重不是因为占有什么,而是贡献了什么如果你把它当成资源,它就会成为你的珍贵资源如果不想做,找一个合适的接手人,知道什么时候收手,是一个不错的主意“我是一个很懒的人,别人干活,...

成功获取数据库数据,但是页面显示不出数据_MarryLin2021的博客-程序员ITS201_数据库查询成功但没出现数据

问题:成功获取数据库的信息前端页面显示不出数据解决办法:修改code码为0(原来我写的code=200)原因:前后端请求格式不匹配,数据格式和和前端要求一致即可,前端的要求可以通过查看其模拟数据得知。...

iOS多线程方案总结及使用详解_dnm25218的博客-程序员ITS201

本篇文章整理了几种iOS中主要的多线程方案,提供了Swift和Objective-C两种语言的写法。概述iOS目前有四种多线程解决方案:NSThreadGCDNSOperationPthreadPthread这种方案太底层啦,实际开发中很少用到,下文主要介绍前三种方案NSThreadNSThread是基于线程使用,轻量级的多线程编程方法(相对G...

winform excel导入mysql_【转】C# Excel 导入到 Access数据库表(winForm版)_孔小哥的博客-程序员ITS201

/// ///获取Excel文件/// /// /// private void button1_Click(objectsender, EventArgs e){OpenFileDialog dlg= newOpenFileDialog();dlg.Filter= "Excel文件(*.xls)|*.xls";if (dlg.ShowDialog() ==DialogResult.OK){str...

随便推点

华纳云:主机的有关硬件你认识多少?_华纳云IDC服务商的博客-程序员ITS201

CPU针脚是什么  CPU针脚就是所说的接口类型,我们知道,CPU需要通过某个接口与主板连接的才能进行工作。CPU经过这么多年的发展,采用的接口方式有引脚式、卡式、触点式、针脚式等。而目前CPU的接口都是针脚式接口,对应到主板上就有相应的插槽类型。CPU接口类型不同,在插孔数、体积、形状都有变化,所以不能互相接插。CPU针脚目前CPU都采用针脚式接口与主板相连,而不同的接口的CPU在针脚数上各不相同。CPU接口类型的命名,习惯用针脚数来表示,比如目前Pentium 4系列处理器所采用的Socket

传输层协议以及数据转发过程_秋凉几度°的博客-程序员ITS201_网络协议转发

一、传输层协议—TCPTCP是一种面向连接的传输层协议,提供可靠的传输服务。1.1 TCP报文格式字段长度含义Source Port16比特源端口,标识哪个应用程序发送Destination Port16比特目的端口,标识哪个应用程序接收Sequence Number32比特序号字段。TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号Aequence Number32比特序号字段。TCP链

美团笔试题(3)外卖满减_酷记麻辣油的博客-程序员ITS201

链接:https://www.nowcoder.com/questionTerminal/95329d9a55b94e3fb2da475d3d052164来源:牛客网你打开了美了么外卖,选择了一家店,你手里有一张满X元减10元的券,店里总共有n种菜,第i种菜一份需要A_i元,因为你不想吃太多份同一种菜,所以每种菜你最多只能点一份,现在问你最少需要选择多少元的商品才能使用这张券。...

PHP开发与以太坊交互调用JSON-RPC_芒果汁的博客-程序员ITS201

自去年以来,我们正在开发区块链(Blockchain)业务。最近使用过Ethereum并使用PHP,所以我想我们应该聊聊这个话题。这里有个前提:1.理解区块链2.对编程语言有了解本文的主要内容:1.开发环境2.以太坊的介绍3.准备JSON-RPC调用4.从PHP访问1.开发环境我们将使用Ubuntu 14.04 LTS。安装操作系统后,输入预先确定的命令。...

淘宝网的技术发展史(一)——个人网站时代_JackieZhengChina的博客-程序员ITS201

《天下网商·经理人》十月刊开始将连载系列文章《淘宝网的技术发展史》,为读者描述淘宝网在整个发展过程中,所有的主动和被动的技术变革的前因后果。文/淘宝技术大学培训专家 子柳  前言11月11日,这个棍子最多的日子被网民自我调侃变成了一个节日——“光棍节”。而淘宝网又用疯狂的折扣促销给它赋予了另外一个意义——“购物狂欢节”。2011年11月11日这一天,淘宝商城(现天猫商城)与

Cilium 首次集成国内云服务,阿里云 ENI 被纳入新版本特性_普通网友的博客-程序员ITS201

​近期 Cilium 社区发布了 Cilium 1.10 正式版本,在这个版本中正式支持阿里云 ENI 模式,阿里云也是国内首家支持 Cilium 的云厂商。Cilium 是一个基于 eBPF 的高性能容器网络项目,提供网络、可观测性、安全三方面的解决方案。Cilium 本身支持 Overlay 网络模式部署在各种云平台或者自建的集群上,但是这种非云原生的网络模式会带来不小的性能损耗。阿里巴巴云原生容器服务团队向 Cilium 社区贡献了阿里云 ENI 模式,使得在阿里云上可以以云原生方式运行 C

推荐文章

热门文章

相关标签