关于模板测试几个问题

1.模板测试的直接结果是什么?

  答:通过模板测试的像素会进入到下一步的深度测试,以期被绘制到color buffer上,没有通过的话,直接丢掉它。

2.stencil buffer的值如何更新?

  答:1.glClearStencil(指定值); 重置stencil buffer里的值为指定值。
    2.glClear(GL_STENCIL_BUFFER_BIT); 重置stencil buffer里的值为0.
       3.通过glStencilOp来指定测试(模板测试或深度测试)通过或未通过时,如何修改stencil buffer里的值,有这些修改方式
            :GL_KEEP GL_ZERO GL_REPLACE GL_INCR GL_DECR GL_INVERT。
      注意有些修改方式的操作数只涉及stencil buffer里的stencil值。而有些涉及到调用方法glStencilFunc时传入的第2个参数:参考值。
           ps: glStencilFunc(比较条件,参考值,比较用掩码)。这个函数指定了模板测试如何进行。先使用一个【比较用掩码】(comparison mask)与【模板缓冲区中的值】进按位与运算,再与【参考值】通过【比较条件】进行比较,满足了条件,就说通过了测试。(你可以查阅glStencilOp的资料,来了解测试结果出来后的后续)。

3.glStencilMask有什么作用?
  答:(1)glStencilMask(0x00)可以关闭stencil buffer的写入,这样就算开启了模板测试(glEnable(GL_STENCIL_TEST),测试结果也不会影响stencil buffer里已有的模板值。
      (2)glStencilMask(0xff)开启stencil buffer的写入,这时候可以往里更新模板数据。
    比如绘制某些物体时,来让物体对应的屏幕像素对应的stencil buffer某些位置的模板值变为1:
      glStencilFunc(GL_ALWAYS,1,0xff);
      glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
      drawAThing();
        ps:记得开启模板测试和模板缓冲区写入。

原文地址:https://www.cnblogs.com/pixs-union/p/8185132.html

时间: 2024-10-20 22:29:22

关于模板测试几个问题的相关文章

opengl 模板测试 glStencilOp glStencilFunc

下面来设置蒙板缓存和蒙板测试. 首先我们启用蒙板测试,这样就可以修改蒙板缓存中的值. 下面我们来解释蒙板测试函数的含义: 当你使用glEnable(GL_STENCIL_TEST)启用蒙板测试之后,蒙板函数用于确定一个颜色片段是应该丢弃还是保留(被绘制).蒙板缓存区 中的值与参考值ref进行比较,比较标准是func所指定的比较函数.参考值和蒙板缓存区的值都可以与掩码进行为AND操作.蒙板测试的结果还导致蒙板缓 存区根据glStencilOp函数所指定的行为进行修改.func的参数值如下: 常量

OpenGL ES 中的模板测试

模板测试的主要功能是丢弃一部分片元,相对于深度检测来说,模板测试提出的片元数量相对较少.模板测试发生在剪裁测试之后,深度测试之前. 使用模板测试时很重要的代码提示: 1 1.glClear( GL_STENCIL_BUFFER_BIT); 2 //启用模板测试 3 2.glEnable(GL_STENCIL_TEST); 大多数情况你的模板遮罩(stencil mask)写为0x00或0xFF就行. 1 // 0xFF == 0b11111111,此时,模板值与它进行按位与运算结果是模板值,模板

OpenGL-----深度测试,剪裁测试、Alpha测试和模板测试

片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测试”的概念,它在绘制三维场景的时候特别有用.在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的.如果使用了深度测试,则情况就会有所不同:每当一个像素被绘制,OpenGL就记录这个像素的“深度”

opengl学习-利用模板测试勾画物体轮廓中出现的一个问题

我在学习OpenGL模板测试勾画物体轮廓的时候,出现了这个问题: 这个出现的原因就是,改变摄像机的时候,每次绘制,上次绘制中模板缓冲区的数据没有清除的原因.也就是在while循环开始的时候,glClear(GL_STENCIL_BUFFER_BIT);没有起作用,原来 我在while的末尾忘记了修改回来模板缓冲区为可写.glStencilMask(0xff); 原文地址:https://www.cnblogs.com/pixs-union/p/8184366.html

模板测试

一: 模板测试 当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,和深度测试一样,它也可能会丢弃片段.接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段.模板测试是根据又一个缓冲来进行的,它叫做模板缓冲(Stencil Buffer). 一个模板缓冲中,(通常)每个模板值(Stencil Value)是8位的.所以每个像素/片段一共能有256种不同的模板值.我们可以将这些模板值设置为我们想要的值,然后当某一个片段有某一个模板值的时候,我们就可以选择丢弃或是保

hdu 2063(二分图模板测试)

int mp[maxn][maxn]; int book[maxn],vis[maxn],sum; bool dfs(int x) { for(int i=1;i<=m;i++) { if(mp[x][i]&&!vis[i]){ vis[i]=1; if(book[i]==0||dfs(book[i])){ book[i]=x; return 1; } } } return 0; } int solve() { int sum=0; memset(book,0,sizeof(book

OpenGL和D3D11中的深度模版测试

    在OpenGL和D3D11的管线中,像素shader之后的操作就是深度模版测试,深度模版测试是以sample为单位进行的,就是一个像素上可以有多个采样点,每个采样点都有深度信息.深度模版测试对每个采样点都要进行一次,如果是msaa,最后要对每次采样的像素结果进行resolve,得到最终的结果.在下面的链接中有msaa的介绍. http://www.cnblogs.com/mikewolf2002/archive/2012/11/22/2783235.html     深度模版测试的流程如

3D模板阴影原理

3D模板阴影原理 1:先从3dsMax中导出一个简单的场景,一个园环,球,平面. 2:园环直接面向光源,园环对球体来说是一个光线的阻挡物,园环在它上面形成阴影,同时,园环和球体对平面来说是光线的阻挡物,所以,同时在其上面形成阴影. 3: 要产生模板阴影,先要找出在园环和球体上面面向光线的面,去除背向光线的面,通过测试光线同园环和球体上面每一个所组成的小角形的法线的夹角是否小于90度,即光线矢量同法线矢量的点积要大于零. 4:在余下的所有面向光线的面中,把每个面的每条边可以保存到一个Vector中

AngularJS测试二 jasmine测试路由 控制器 过滤器 事件 服务

测试应用 1.测试路由 我们需要检测路由是否在运作,是否找到了,或者是404了.我们要确认路由事件触发了,预期的模板是否真的加载了.既然路由会改变页面的地址(URL)和页面内容,我们需要检测路由是否被加载了,页面是否找到了,在这中间发生了什么. 一段简单的路由代码: angular.module('myApp', ['ngRoute']) .config(function($routeProvider) { $routeProvider .when('/', { templateUrl: 'vi