美文网首页
【六十五,高级OpenGL-02模板测试】

【六十五,高级OpenGL-02模板测试】

作者: Woodlouse | 来源:发表于2020-05-25 21:40 被阅读0次

模板测试

片段着色器处理完之后,模板测试就开始执行了,它能丢弃一些片段,被保留下来的片段会进入到深度测试,深度测试会丢弃更多的片段。

模板测试中的模板值通常是八位的,因此每个片段/像素共有256种不同的模板值,这样我们能将这些模板值设置为我们链接的,然后在模板测试时根据这个模板值,我们就可以决定丢弃或保留它了。

使用模板缓冲,要遵守的原则:

  • 开始模板缓冲写入;
  • 渲染物体,更新模板值;
  • 关闭模板缓冲写入;
  • 渲染(其他)物体,这次基于模板缓冲内容丢弃特定的片段;

开启模板缓冲写入
glEnable(GL_STENCIL_TEST);

清空模板缓冲
glClear(GL_COLOR_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

设置位遮罩(Bitmask)

glStencilMask(0xFF);
glStencilMask(0x00);

模板函数

模板函数有两个作用:
1,何时模板测试通过或者测试失败;
2,在测试通过/失败时如何操作模板值;

分别对应两个函数:
1,glStencilFunc(GLenum func, GLint ref, GLuint Mask);
func: : 模板测试函数
ref: : 指定模板测试的引用值,模板缓冲的内容和这个值比较;
Mask:* : 指定一个遮罩,在模板测试对比引用值和储存的模板值前,对它们进行按位与(and)操作,初始设置为1。

2,glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass);
sfail:模板测试失败将采取的动作;
dpfail:模板测试通过,深度测试失败将采取的动作;
*dppass:模板测试,深度测试都通过将采取的动作;
可以采取的动作:

操作 描述
GL_KEEP 保持现在的模板值
GL_ZERO 将模板值设置为0
GL_REPLACE 将模板值设置为glStencilFunc中设置的ref值
GL_INCR 如果模板值不是最大值则+1
GL_INCR_WRAP 与GL_INCR一样将模板值+1,如已是最大则设置为0
GL_DECR 将模板值减1
GL_DRCR_WRAP 与GL_DECR一样将模板值减1,如已是最小,则设置为0
GL_INVERT Bitwise inverts the current stencil buffer value.

应用

模板测试特别有用的一个功能是:物体轮廓(Object Outlining)
物体轮廓就像它的名字所描述的那样,它能够给每个(或一个)物体创建一个有颜色的边。在策略游戏中当你打算选择一个单位的时候它特别有用。给物体加上轮廓的步骤如下:

1,在绘制物体前,把模板方程设置为GL_ALWAYS,用1更新物体将被渲染的片段。
2,渲染物体,写入模板缓冲。
3,关闭模板写入和深度测试。
4,每个物体放大一点点。
5,使用一个不同的片段着色器用来输出一个纯颜色。
6,再次绘制物体,但只是当它们的片段的模板值不为1时才进行。
7,开启模板写入和深度测试。

最终实现效果图如下:


物体轮廓

模板测试-物体轮廓代码

相关文章

  • 【六十五,高级OpenGL-02模板测试】

    模板测试 片段着色器处理完之后,模板测试就开始执行了,它能丢弃一些片段,被保留下来的片段会进入到深度测试,深度测试...

  • 14.opengl高级-模板测试

    [努力更新中]opengl系列学习笔记(mac xcode) 1. 原理说明 1.1 模板测试像增加了一层遮罩,根...

  • 模板测试

    其实UGUI的Mask,就是使用了模板测试。 什么是模板测试?(Stencil Buffer)如果开启了模板测试,...

  • Yii 单元测试

    1.下载yii框架 2.yii 自带Codeception 测试框架,并预装了基本和高级项目模板。 也可自行安装 ...

  • Shader-模板测试

    模板测试 模板测试在透明度测试之后,在深度测试之前 使用模板缓冲区最重要的两个值:当前模板缓冲值(stencilB...

  • 测试用例和测试计划

    ***测试用例的******image.png ******模板介绍*** 测试用例的模板 测试用例定义: 要素:...

  • 模板解析

    模板解析函数 测试 测试结果

  • NDK OpenGL ES 3.0 开发(十一):模板测试

    该原创文章首发于微信公众号:字节流动 OpenGL ES 模板测试 模板测试与深度测试类似,主要作用是利用模板缓冲...

  • 高级模板

    虽然大部分与Django模板语言的交互都是模板作者的角色,但您可能需要自定义和扩展模板引擎 - 要么做一些它还没有...

  • 几种常见的序列化方式简单使用及比较

    C++常见序列化方式 json 测试 结果 protobuf 数据模板 测试 结果 capnproto 数据模板 ...

网友评论

      本文标题:【六十五,高级OpenGL-02模板测试】

      本文链接:https://www.haomeiwen.com/subject/ywdxghtx.html