走进Stencil Buffer 系列0 : 模板缓冲和模板测试是什么?
文章推薦指數: 80 %
模板测试(Stencil Test)是现代渲染流水线的一环,其中涉及到的就是模板缓冲(Stencil Buffer),模板缓冲可以用来制作物体的遮罩、轮廓描边、阴影、 ...
首页
登录/注册
English
En
English
简体中文
新浪微博
indienova
QQ群:714980405(点击查看全部群聊)
知乎专栏
indienova
Facebook
Twitter
info(at)indienova.com
走进StencilBuffer系列0:模板缓冲和模板测试是什么?
作者:阿创
2020-04-27
9
4
1
编辑注:StencilBuffer相关文章站内其实有文章和日志涉及到过。
比如较为大家关注的《笼中窥梦(Moncage)》采访时就有提到(笼中窥梦@indienova)。
这一次作者阿创投稿的系列文章将带大家了解更多相关的知识。
模板测试(StencilTest)是现代渲染流水线的一环,其中涉及到的就是模板缓冲(StencilBuffer),模板缓冲可以用来制作物体的遮罩、轮廓描边、阴影、遮挡显示等等效果,本章将带你了解什么是模板缓冲和模板测试。
一、模板缓冲是什么?对现代渲染流水线有过了解的同学,一定知道深度测试(DepthTest)吧,深度测试可以从一个特定角度达到最近物体的排序的效果,与之相关的深度缓冲(DepthBuffer)里的值始终保存离摄像机最近物体的深度值(透明物体除外),这样就可以从前往后绘制物体了,避免了很多的overdraw,大大提高了渲染性能,是渲染流水线不可或缺的一环。
但在深度测试之前还有一个测试,就是模板测试(StencilTest),其知名度远远不及深度测试,有很多同学都只是偶尔听过一两下,不知道是什么东西,有啥用(就是之前的我了……)下面就由我来带大家了解一下吧~要想了解什么是模板测试,首先需要了解什么是模板缓冲(StencilBuffer)。
其实和深度缓冲类似。
模板缓冲也可以为屏幕上的每一个像素进行保存一个8位的无符号整数,即范围0~255的整数;在Unity中,我们可以将这些模板值设置为我们想要的值,然后在随后渲染结果Pass与其进行比对,根据比对结果,我们就可以选择丢弃或是保留这个像素。
此过程发生在渲染流水线的合并阶段中,具体在片元着色器之后,深度测试之前,被称为模板测试(StencilTest)。
通俗的来说,模板测试就像上图我们用的喷漆涂鸦一样。
我们首先准备一张中间镂空形状为T的纸板,还有一张空白底板。
当我们拿喷漆喷在镂空纸板上,结果只有镂空的部分喷漆才能通过。
这样就在空白底板印上了T字图案。
以上喷漆其实就对应了我们每一个像素的颜色,而镂空纸板对应就是模板(测试),最后空白底板就对应了最终显示在我们眼前的屏幕。
我猜这就是StencilBuffer名字的由来吧……二、Unity中的语法1.Stencil常见语法格式Stencil{
RefreferenceValue//参考值默认值为0
CompcomparisonFunction//定义参考值与缓冲值比较的方法默认值为Always
PassstencilOperation//定义当通过模板测试时,根据参考值对缓冲值的处理方法默认值为keep
FailstencilOperation//定义当没有通过模板测试时,根据参考值对缓冲值的处理方法默认为keep
ZFailstencilOperation//定义当通过模板测试却没有通过深度测试时,根据参考值对缓冲值的处理方法默认为keep
}举个实际例子Stencil{
Ref1
CompEqual
PassKeep
}上述代码的意思是:我们自己设定了Ref 参考值为1。
渲染Pass得到像素颜色后,拿参考值1与模板缓冲中此像素位置的缓冲值比对,只有Equal 相等才算通过,并且Keep 保持原有缓冲值,否则丢弃此像素颜色。
例子:指定只渲染stencil值为1的像素颜色三、后续安排通过本章,相信大家已经了解了什么是模板缓冲了。
也简单了介绍其在UnityShaderLab中的语法。
后续几章将介绍在实际开发中,运用模板缓冲达到效果实现(应该不会咕咕咕吧,作业不多的话……)我也可能没讲清楚哈哈哈,大家有啥不懂也积极评论交流嘛,大家一起学习进步~参考资料OpenGL模板缓冲区的理解:https://www.jianshu.com/p/89c2454bcd26UnityShader实例09:StencilBuffer&StencilTest:https://blog.csdn.net/u011047171/article/details/46928463模板测试:https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/02%20Stencil%20testing/下一章预告运用StencilBuffer实现的轮廓描边:
赞这篇文章
9
收藏这篇文章
4
本文为用户投稿,不代表indienova观点。
近期点赞的会员
文中提到的游戏
71
笼中窥梦
Moncage
分享这篇文章
阿创
作者
查看作者主页
查看作者文章
一句话介绍测试
您可能还会对这些文章感兴趣
基于高度的纹理混合shader
Journey中的沙丘渲染(及其shader实现)
GodotShader入门:做一套像素文字Shader
在手机游戏中实现下雨系统
Makin'StuffLookGood:着色器入门之101
shader
StencilBuffer
参与此文章的讨论
喵喵桑
2020-04-27
起点有点高
0
您需要登录或者注册后才能发表评论
登录/注册
延伸文章資訊
- 1模板测试
当片段着色器处理完一个片段之后, 模板测试 (Stencil Test)会开始执行,和深度 ... 模板测试是根据又一个缓冲来进行的,它叫做 模板缓冲 (Stencil Buffer),我们可以...
- 2Stencil Test(模板测试)不得不说的那些事- 中文社区博客
Stencil test是per-fragment operations的一种,这就意味着它处于fragment shader (片段着色器)之后,stencil test的主要作用就是根据st...
- 3Stencil Test - OpenGL Wiki
The Stencil Test is a per-sample operation performed after the Fragment Shader. The fragment's st...
- 4模板测试
当片段着色器处理完片段之后,模板测试(Stencil Test) 就开始执行了,和深度测试 ... 模板测试基于另一个缓冲,这个缓冲叫做模板缓冲(Stencil Buffer),我们被允许在 ...
- 5Unit Testing - Stencil.js
Stencil makes it easy to unit test components and app utility functions using Jest. Unit tests va...