下面的案例通过模版实现三角形截取的功能,代码如下:

void draw(){
GLuint programObject; GLfloat vVerticessmall[] = { 0.0f, 0.25f, 0.0f,
-0.25f, -0.25f, 0.0f,
0.25f, -0.25f, 0.0f
}; GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f
}; GLfloat vColorssmall[] = { 0.0f, 0.5f, 0.0f,1.0f,
0.0f, 0.5f, 0.0f,1.0f,
0.0f, 0.5f, 0.0f,1.0f,
};
GLfloat vColorsbig[] = { 0.5f, 0.5f, 0.0f,1.0f,
0.5f, 0.5f, 0.0f,1.0f,
0.5f, 0.5f, 0.0f,1.0f,
}; //这里视口的像素要和 分配的纹理大小一致,这样才可以绘制全图,
//注意这里的屏幕大小是以 纹理大小 为准了,与手机屏幕大小没有关系
glViewport(,,,);
glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); char vShaderStr[] =
" attribute vec4 a_position; \n"
" attribute vec4 a_color; \n " "\n#ifdef GL_ES\n"
"varying lowp vec4 v_fragmentColor;"
"varying mediump vec2 v_texCoord;"
"\n#else\n"
" varying vec4 v_fragmentColor;"
"varying vec2 v_texCoord;"
"\n#endif\n" " void main() { \n"
" gl_Position = a_position; \n"
" \n"
" v_fragmentColor= a_color ; \n"
" } \n";
//片段着色器
//写入的这个变量将被写入颜色缓冲区
char fShaderStr[] =
" \n"
" \n"
"\n#ifdef GL_ES\n"
"precision lowp float;"
" \n#endif\n" " varying vec4 v_fragmentColor; \n"
" \n"
"void main() \n"
"{ \n"
" gl_FragColor = v_fragmentColor ; \n"
"} \n"; programObject= esLoadProgram ( vShaderStr, fShaderStr );
glUseProgram ( programObject );
// glEnable(GL_DEPTH_TEST);
glEnable(GL_STENCIL_TEST); s_layer++;
//左移s_layer位,一个模版点8位的话,最多可以移动8次
GLint mask_layer = 0x1 << s_layer;
//得到前一位,比如如果s_layer=100,那么mask_layer_l=011
GLint mask_layer_l = mask_layer - ;
//两个相与,得到 111
_mask_layer_le = mask_layer | mask_layer_l; /*
设置模板缓冲区的写入掩码:
只允许mask位被写入
glStencilMask控制模板平面中各个位的写入。 掩码的最低有效n位,其中n是模板缓冲区中的位数,指定掩码。 只要出现一个1,模板缓冲区中的相应位就可写。 如果出现0,则该位被写保护。 最初,所有位都被启用以进行写入。
*/
//这个方法很关键,控制被写入的位数,比如mask_layer=10,那么只能在第二位写入数据,其余的不动
glStencilMask(mask_layer); glStencilFunc(GL_NEVER, mask_layer, mask_layer);
glStencilOp(GL_REPLACE , GL_KEEP, GL_KEEP);
/*****************屏蔽的部分***********************/
//glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0,vVertices);
// glEnableVertexAttribArray ( 0 );
// glVertexAttribPointer ( 1, 4, GL_FLOAT, GL_FALSE, 0, vColorsbig );
// glEnableVertexAttribArray ( 1 );
//
// glDrawArrays ( GL_TRIANGLES, 0, 3 ); //再次向左移动一位
s_layer++;
mask_layer = 0x1 << s_layer;
mask_layer_l = mask_layer - ;
_mask_layer_le = mask_layer | mask_layer_l; //比如如果是100,那么就只能向第三位写入数据
glStencilMask(mask_layer); glStencilFunc(GL_NEVER,0xFF, 0xFF);
glStencilOp(GL_REPLACE , GL_KEEP, GL_KEEP); // 绘制小三角形
//通过绘制,因为之前设置的Never,所以这次只是替换mask_layer到模版缓冲区,因为之前设置了 glStencilMask
//所以只能向数字为1的地方写入,如果mask_layer=100,那么只能吧1写入到第三位
glVertexAttribPointer ( , , GL_FLOAT, GL_FALSE, , vVerticessmall );
glEnableVertexAttribArray ( );
glVertexAttribPointer ( , , GL_FLOAT, GL_FALSE, , vColorssmall );
glEnableVertexAttribArray ( );
glDrawArrays ( GL_TRIANGLES, , );
//这里的条件是满足全部的值,比如111
glStencilFunc(GL_EQUAL, _mask_layer_le,_mask_layer_le);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
//绘制大三角形
glVertexAttribPointer ( , , GL_FLOAT, GL_FALSE, ,vVertices);
glEnableVertexAttribArray ( );
glVertexAttribPointer ( , , GL_FLOAT, GL_FALSE, , vColorsbig );
glEnableVertexAttribArray ( );
glDrawArrays ( GL_TRIANGLES, , ); s_layer--;
s_layer--;
glDisable(GL_STENCIL_TEST); }

运行程序,发现什么也没绘制

然后把标红的屏蔽代码打开,运行,绘制如图所示:

分析原因:

大部分代码都有注释,简单说一下:

通过上面代码的运行,_mask_layer_le的二进制数最终为00000011,也就是绘制的时候,模版缓冲区的每一像素点的值为00000011,才能运行继续绘制,如果屏蔽掉那段代码,那么模版缓冲区中将只有00000000和00000010的数据,没有符合条件的,所以没有绘制出来,反之,会使模版缓冲区中一部分数据为00000011,所以这部分三角形绘制了出来

OpenGL模版小案例分析的更多相关文章

  1. 案例分析——Who is the king of handwriting notes?

    案例分析--Who is the king of handwriting notes? 项目 内容 这个作业属于那个课程 2021春季学期软件工程(罗杰.任健) 这个作业的要求在哪里 案例分析 我在这 ...

  2. 【MySQL】排序原理与案例分析

    前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐 ...

  3. K米APP案例分析

    关于 K米 -- 的案例分析 产品 K米的APP (全国KTV点歌,手机直播,互动,交友,预订)的Android客户端 第一部分 调研,评测 评测: 软件的bug,功能评测,黑箱测试 • 下载并使用, ...

  4. [Mugeda HTML5技术教程之15]案例分析:制作移动教育课件

    本文档要分析的案例是一个一氧化碳还原氧化铜的教育小课件,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作移动教育课件的方法.Mugeda为移动教育领域和移动数字出版领域提供理想的教 ...

  5. [Mugeda HTML5技术教程之14]案例分析:制作网页游戏

    本文档要分析的案例是一个爱消除的网页小游戏,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作网页游戏的方法. (一)游戏规则: 1.开始游戏时,手机出现在最上面一行的任意一格: 2 ...

  6. 阿里云资深DBA专家罗龙九:云数据库十大经典案例分析【转载】

    阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的&l ...

  7. mysql转ElasticSearch的案例分析

    前言 最近工作中在进行一些技术优化,为了减少对数据库的压力,对于只读操作,在程序与db之间加了一层-ElasticSearch.具体实现是db与es通过bin-log进行同步,保证数据一致性,代码调用 ...

  8. 个人作业二——英语学习APP 案例分析

    英语学习APP的案例分析 我们生活中很多时候要和软件打交道,大家上课开小差时候玩的手机游戏,买火车票的网站,互相联系用的微信.QQ,等等都是软件,都很值得分析.你为何成为它们的用户?它们的团队做对了什 ...

  9. 个人作业2————英语学习APP的案例分析

    必应词典案例分析 第一部分 调研, 评测 1.下载并使用 第一次使用必应词典,安装完打开便是这样的界面,第一印象还行,界面平平无奇,比较简洁,上面分四个模块,这样一眼看去感觉功能比较单一 使用了下例句 ...

随机推荐

  1. 996.icu 事件后

    996.icu 事件后 雇主 更加关注效率 减少成本 分工再细化 精简人员 雇员 法律意识加强 个人权利争取 效率低者下岗 技能提高 效率提高 影响 商业社会更有效率 人力市场竞争更加激烈 国内竞争力 ...

  2. openstack--3--控制节点安装配置keystone

    Keystone介绍 Keystone作用 用户与认证:用户权限与用户行为跟踪: 服务目录:提供一个服务目录,包括所有服务项与相关Api的端点,它是个注册中心 用户认证包括:User,Tenant,T ...

  3. java项目中异常处理情况

    一,基本概念   异常是程序在运行时出现的不正常情况.是Java按照面向对象的思想将问题进行对象封装.这样就方便于操作问题以及处理问题.  异常处理的目的是提高程序的健壮性.你可以在catch和fin ...

  4. ZeroTier One

    ZeroTier – 无配置,零基础「内网穿透」随时随地连回家/学校/办公室 [跨平台] https://www.appinn.com/zerotier-one/ Virtual NetworkZer ...

  5. [转]ArrayList的实现原理

    1. ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部 ...

  6. TP5模型belongsTo和hasOne的区别

    在使用tp5模型的ORM的时候出现belongsTo和hasOne都有表示一对一的关系,但是二者并不相同.以下举例说明两者的区别: 首先有user表 字段 id name password字段 然后有 ...

  7. NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)

    创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统 ...

  8. ML: 降维算法-LE

    PCA的降维原则是最小化投影损失,或者是最大化保留投影后数据的方差.LDA降维需要知道降维前数据分别属于哪一类,而且还要知道数据完整的高维信息.拉普拉斯特征映射 (Laplacian Eigenmap ...

  9. 阅读<SMPTE 274M-2005 1920X1080>笔记

    阅读<SMPTE 274M-2005 1920X1080>笔记 1.1080i blank field 2.blank and active line timing Analog Digi ...

  10. windows下安装redis以及测试 --转载自http://www.cnblogs.com/lpyan/p/5608333.html

    redis加入到Windows 服务 以下方式,需要在redis-2.8.24下执行:http://download.csdn.net/download/feiliua/9425770 ,另外php的 ...