Stencil buffer_拳四郎的博客
文章推薦指數: 80 %
模版缓冲(stencil buffer)或印模缓冲,是在OpenGL三维绘图等计算机图像硬件中常见的除颜色缓冲、像素缓冲、深度缓冲之外另一种数据缓冲。
Stencilbuffer
拳四郎
于 2015-06-2420:40:46 发布
9686
收藏
12
分类专栏:
计算机图形学
文章标签:
unity3d
三维图像
图形
版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/silangquan/article/details/46608915
版权
计算机图形学
专栏收录该内容
47篇文章
21订阅
订阅专栏
Stencilbuffer
模版缓冲(stencilbuffer)或印模缓冲,是在OpenGL三维绘图等计算机图像硬件中常见的除颜色缓冲、像素缓冲、深度缓冲之外另一种数据缓冲。
词源模版(stencil)是指一种印刷技术,通常以蜡纸或者钢板印刷文字或图形;区别于模板(template),用木板为外形修剪的依据来复制形状;模版(stencil)是指印模,而模板(template)主要是指形模。
模版缓冲是以像素为单位的,整数数值的缓冲,通常给每个像素分配一个字节长度的数值。
深度缓冲与模版缓冲经常在图形硬件的随机存取内存(RAM)中分享相同的区域。
模板缓冲所在的是整个流水线的最后一个阶段,这个阶段的流水线如下
最简单的情况,模版缓冲被用于限制渲染的区域。
更多高级应用会利用深度缓冲与模版缓冲的在图形渲染流水线中的强关联关系。
例如,模版的数值可以按每个像素是否通过深度测试来自动增加或减少。
简单组合使用深度测试与模版修饰符可以使得大量的本来需要多次渲染过程的效果(例如阴影、外形的绘制或复合几何图元(Geometricprimitive)的交叉部分的高光处理)可以简单实现,因此减轻了图形硬件的负担。
最典型的应用是给三维图像加阴影。
也用于平面反射。
其它渲染的技术,例如,视口渲染(portalrendering),利用模版缓冲作其它用途。
例如,它可以被用于查找被视口遮蔽的屏幕区域然后重新正确渲染这些像素点。
模版缓冲与其修饰符可以通过OpenGL或Direct3D的应用程序编程接口(API)来访问。
常用的比较操作
GreaterOnlyrenderpixelswhosereferencevalueisgreaterthanthevalueinthebuffer.GEqualOnlyrenderpixelswhosereferencevalueisgreaterthanorequaltothevalueinthebuffer.LessOnlyrenderpixelswhosereferencevalueislessthanthevalueinthebuffer.LEqualOnlyrenderpixelswhosereferencevalueislessthanorequaltothevalueinthebuffer.EqualOnlyrenderpixelswhosereferencevalueequalsthevalueinthebuffer.NotEqualOnlyrenderpixelswhosereferencevaluediffersfromthevalueinthebuffer.AlwaysMakethestenciltestalwayspass.NeverMakethestenciltestalwaysfail.
模版像素操作
KeepKeepthecurrentcontentsofthebuffer.ZeroWrite0intothebuffer.ReplaceWritethereferencevalueintothebuffer.IncrSatIncrementthecurrentvalueinthebuffer.Ifthevalueis255already,itstaysat255.DecrSatDecrementthecurrentvalueinthebuffer.Ifthevalueis0already,itstaysat0.InvertNegateallthebits.IncrWrapIncrementthecurrentvalueinthebuffer.Ifthevalueis255already,itbecomes0.DecrWrapDecrementthecurrentvalueinthebuffer.Ifthevalueis0already,itbecomes255.
Zfail
Whattodowiththecontentsofthebufferifthestenciltestpasses,butthedepthtestfails.Default:keep.
例子
下面是Unity文档里的例子,文档有点错误,按照文档的代码是写不出对应的结果的。
首先在场景里放一个红球,Shader如下
Shader"Custom/RedStencil"{
SubShader{
Tags{"RenderType"="Opaque""Queue"="Geometry"}
Pass{
Stencil{
Ref2
Compalways
Passreplace
ZFaildecrWrap
}
CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
structappdata{
float4vertex:POSITION;
};
structv2f{
float4pos:SV_POSITION;
};
v2fvert(appdatav){
v2fo;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
returno;
}
half4frag(v2fi):SV_Target{
returnhalf4(1,0,0,1);
}
ENDCG
}
}
}
结果如下
stencil的值在球体绘制的地方被赋为2,没有绘制的地方为0.
接下来画绿色的球
Shader"Custom/GreenStencil"{
SubShader{
Tags{"RenderType"="Opaque""Queue"="Geometry+1"}
Pass{
Stencil{
Ref2
Compequal
Passkeep
FaildecrWrap
ZFailIncrSat
}
CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
structappdata{
float4vertex:POSITION;
};
structv2f{
float4pos:SV_POSITION;
};
v2fvert(appdatav){
v2fo;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
returno;
}
half4frag(v2fi):SV_Target{
returnhalf4(0,1,0,1);
}
ENDCG
}
}
FallBack"Diffuse"
}
绘制结果如下,绿色的部分是stencilpass的,绿球没有被绘制出来的地方stecil值会减一,变为255.有一部分通过的stenciltest,但是没有通过ztest的,stencil值+1,变成3
最后画蓝色的球,shader如下
Shader"Custom/BlueStencil"{
SubShader{
Tags{"RenderType"="Opaque""Queue"="Overlay"}
Pass{
Stencil{
Ref3
CompEqual
}
CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
structappdata{
float4vertex:POSITION;
};
structv2f{
float4pos:SV_POSITION;
};
v2fvert(appdatav){
v2fo;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
returno;
}
half4frag(v2fi):SV_Target{
returnhalf4(0,0,1,1);
}
ENDCG
}
}
}
蓝色球只在stencilbuffer值为3的地方绘制出来了。
参考
ShaderLab:Stencil- http://docs.unity3d.com/Manual/SL-Stencil.html
Extrabuffers- https://open.gl/depthstencils
OpenGLProgramming/Stencilbuffer- https://en.wikibooks.org/wiki/OpenGL_Programming/Stencil_buffer
拳四郎
关注
关注
2
点赞
踩
0
评论
12
收藏
打赏
扫一扫,分享内容
点击复制链接
专栏目录
用StencilBuffer实现在UGUI上嵌入3D模型
06-24
用StencilBuffer实现在UGUI上嵌入3D模型
UnityShader:理解Stencilbuffer并将它用于一些实战案例(描边,多边形填充,反射区域限定,阴影体shadowvolume阴影渲染)
liu_if_else的博客
01-11
1万+
本文示例项目Github连接:https://github.com/liu-if-else/UnityStencilBufferUses
有两次被人问到stencilbuffer的用法,由于对它的印象一直比较模糊回答的含糊其辞,这两天研究了下它并总结出此文。
1,Stencilbuffer在OpenGL渲染管线/UnityShader中的角色
为什么叫stencil模板
如果将屏幕上所有像...
参与评论
您还未登录,请先
登录
后发表或查看评论
什么是模板缓冲(StencilBuffer)
徐新华的专栏
10-08
5523
什么是模板缓冲(StencilBuffer)
模板缓冲类似于深度缓冲。
事实上,它使用深度缓冲的一部分(因此,深度缓冲常常被称做depth-stencil缓冲)。
深度缓冲让程序员可以设置一个模板函数测试"reference(参考)"模板值-一个全局值–每次当这个值仍然在
图形学习--理解stenciltest、depthtest
weixin_40273050的博客
01-18
282
共同点:它们的目的都是为了丢弃片元!!!
1.**模板测试(stenciltesting)**:FS处理完一个片元之后,通过模板测试决定是否要丢弃它,可简单理解stencil就是个mask掩码,1表示通过,0表示丢弃;此过程发生在渲染流水线的合并阶段中,具体在片元着色器之后,深度测试之前;
2.**深度测试(depthtesting)**:深度测试可以从一个特定角度达到最近物体的排序的效果,与之相关的深度缓冲(Depth Buffer)里的值始终保存离摄像机最近物体的深度值(透明物体除外)
Stencil基础
dbghum0371的博客
10-19
267
Stencil
一个轻量化,渐进式编译器,注意,不是框架。
使用TypeScript进行所有操作,这是一个门槛,有一定技术门槛要求。
PS:个人强烈推荐所有的前端同学都学习,或至少了解这个超集语言。
生命周期
componentWillLoad
componentDidLoad
componentWillUpdate
componentDidUpdate
componentDi...
Unity3d中渲染到RenderTexture的原理,几种方式以及一些问题
热门推荐
leon
02-10
6万+
虽然RenderTexture这个技术是个普遍使用的技术,但是用好它还是要理解他的底层原理和避免一些使用的问题。
这里就UNITY3d中的RenderTexure介绍Rendertexture的底层原理和使用时可能遇到的坑和效率问题。
OpenGL学习笔记——StencilBuffer
正经的时候都在打游戏
10-18
470
StencilBuffer是模板缓冲,可以用来实现一些诸如描边,遮罩之类的操作。
一开始我理解起来很费劲,后来结合几个例子,终于明白了使用StencilBuffer的要点。
使用StencilBuffer,分为两大部分:
【1】创建stencilBuffer部分
创建Stencil,用其他模型,遮罩等的片段,去创建stencilbuffer。
(遮罩也完全可以不被显示出来,只更
蒙版缓存(Stencilbuffer)
fallStones的专栏
03-28
2643
什么是蒙版缓存
图像硬件中有个特殊内存,叫Stencilbuffer。
很多地方翻译做模板缓存,我觉的用蒙版缓存更贴切。
因为这个缓存的和PS的图层蒙版很相似。
渲染目标(RenderTarget,可以是屏幕,可以是离屏表面,可以是纹理)中每个像素在蒙版缓存中都有对应的蒙版值(StencilRef)。
缓存中还有一个可以设置的蒙版函数(CompareFunction),例如CompareFunction,例如CompareFunction.Greater(大于)、CompareFun
[学习笔记]关于Stencil使用的学习
本庸
02-11
4751
看过大牛的一个场景切换的效果https://www.bilibili.com/video/av61096176/,非常震撼,打算实现一下。
关于Stencil的介绍,从另一个大牛文章中截取了一部分:
Stencil{
Ref2
Compequal
Passkeep
FaildecrWrap
ZFailkeep
}
下面一条一条来:
RefreferenceValu...
关于unityshader的StencilBuffer
VinceLi的博客
08-07
1万+
关于unityshader的StencilBuffer
这几天学了unityshader,不得不说unityshader小小的选择项竟然蕴含了这么多东西,最近看到shaderlab的stencilbuffer真是搞得一头雾水,网上也没有对stencil在untiy的介绍,有也是很简略的,圣典也还没翻译,就官网那几个字,真不知道写那个的人是怎么想的,就写那几个字怎么让人明白那怎么回
UnityShader实例09:StencilBuffer&StencilTest
lupeng的博客
07-17
2万+
StencilBuffer&StencilTest
在开始前先吐槽下unity的官方文档,说实话关于stencil,官方文档真的是可以不要了,除了记流水账般解释了下各个参数的作用,作为例子的shader也是让人一头雾水,整个文档看下来,你发觉stencil是用来干嘛的,怎么操作,仍然不知道。
好在unity的shaderlab和D3D,OpenGL等shader语言是一致的,还
OpenGL模板缓冲stencil
03-27
249
glEnable(GL_DEPTH_TEST);
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
glStencilMask(0x00);//记得保证我们在绘制地板的时候不会更新模板缓冲
nor...
StencilBuffer(模板缓冲区)
weixin_30408739的博客
12-13
206
作者:Nin+.Lee
邮箱:[email protected]
*本文属原创,转载请注明出处。
与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值。
这个值的具体意义视程序的具体应用而定。
在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。
这个比较的过程被称为模板测试。
模板测试发生在透明度测...
StencilBuffer模板缓冲
安都奕雨的博客
04-10
78
1、Stencilbuffer概念:
屏幕平面好比一块大的平面,然后每个像素都有自己对应的stencil值,可以把他理解为一个数字标记,然后所有像素的初始默认stencil值都是0
这个时候如果想用到StencilBuffer,那么就要去改变这些像素的值来舍弃或保留这些像素,相当于去判断渲染哪些像素
stencilbuffer其实是zBuffer其中的一部分,StencilTest在ZTest之前,两者紧密联系,存在于显存内的某一片区域中。
目前的显卡架构中,比如在depth/stencil缓冲区某个
OpenGL模板缓冲区---StencilBuffer
Frank的专栏
04-12
1万+
前言
Unity3D中的RenderTexture详解
御坂御坂001的博客
06-13
1万+
文章目录RenderTexture是什么什么是server-sider的texture?什么是FrameBufferObject?这有什么用?渲染到RenderTexture的几种方式从rendertex获取结果其他的一些问题
RenderTexture是什么
在U3D中有一种特殊的Texture类型,叫做RenderTexture,它本质上一句话是将一个FrameBufferObjecrt连接到...
用imspost制作catia后处理_利用StencilBuffer实现局部后处理描边
weixin_39996739的博客
11-20
384
前言本文主要介绍了如何使用StencilBuffer实现局部后处理描边,主要分为三个部分,对不透明物体的描边,对透明度测试物体的描边和对透明度混合物体的描边.起因是看到了一篇关于口袋妖怪X/Y的分享文章,里面介绍的描边方式是用的后处理方式,是根据法线,顶点色和StencilBuffer共同作用下进行描边,StencilBuffer在这里主要是辅助作用,对于其他方式不容易获取的描边,通过Stenci...
[cocos2dx]RenderTexture画布类
超越
09-14
3390
3.x的渲染机制改动比较大,改变了之前在每帧遍历所有的Node树节点时通过draw()方法中的直接渲染,而是通过生成渲染指令并将渲染指令发送到渲染队列,在每一帧结束时进行延迟渲染,这样就把游戏循环和渲染分离开来。
Cocos2d-x提供了一个RenderTexture类来支持把帧缓冲中的数据渲染到一块纹理之上,通过它可以来实现游戏截图,获取纹理上的像素信息等效果,在3.x的RenderTexutru
【UnityShader】关于Stencil的理解小记
最新发布
alicelise的博客
04-24
1863
写在前面:本文只介绍Stencil最基本的三种参数:RefCompPass,其他的略略带过。
碎碎念:之前用过Stencil,但是没有完全理解,原因在于虽然理解了每项的意思,但是实际的使用效果不如人意,最后得出的结果纯靠运气试出来的。
昨晚按照渲染流程走了一遍,豁然开朗,感觉自己好瓜皮qaq
Stencil简介
Stencil是模板测试的意思,通常写在Pass里面最开头,CGPROGRAM之前。
stencil完整语法格式如下:
stencil{
RefreferenceValue
ReadM.
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
拳四郎
CSDN认证博客专家
CSDN认证企业博客
码龄13年
暂无认证
408
原创
1万+
周排名
77万+
总排名
248万+
访问
等级
2万+
积分
2514
粉丝
995
获赞
724
评论
2228
收藏
私信
关注
热门文章
彻底搞懂四元数
90078
详解KDTree
73511
三种工厂模式的C++实现
34872
详解MVP矩阵之ViewMatrix
32681
光线追踪(RayTracing)算法理论与实践(一)入门
28262
分类专栏
游戏开发
51篇
Rendering
11篇
OpenGL进阶
19篇
ProcedualGeneration
10篇
MultiplayerGameProgramming
5篇
CharacterCameraControl
2篇
GameDesign
2篇
Physics&Math
12篇
Unity炫酷实战
9篇
计算机图形学
47篇
C&C++
48篇
数据结构与算法
34篇
科研科研
13篇
翻译
22篇
剑指XX游戏
10篇
移动开发
13篇
java
25篇
Android实战
45篇
Ubuntu&Linux
37篇
web开发
10篇
Qt
10篇
读书.游戏.电影.生活
18篇
7788
9篇
最新评论
碰撞检测之Ray-Box检测
iloveas2014:
楼主好,
对于矩形,假设出现碰撞的情况,则存在分离轴平行矩形的一条边。
(这个后面会证明)
这里的后面在哪儿呢?
三种工厂模式的C++实现
BulaBula:
简单工厂模式中对象释放存在内存泄漏的问题
三种工厂模式的C++实现
BulaBula:
简单工厂模式中对象释放存在内存泄漏的问题
游戏开发中的程序生成技术
MusicLEEE:
大佬太强了,学到很多东西!
Minecraft源码分析(6)-forge环境配置
qq_43010024:
[code=plain]
D:\projects\forge-1.12.2-14.23.5.2855-mdk>gradlewsetupDecompWorkspace
TohonourtheJVMsettingsforthisbuildanewJVMwillbeforked.Pleaseconsiderusingthedaemon:https://docs.gradle.org/4.9/userguide/gradle_daemon.html.
Daemonwillbestoppedattheendofthebuildstoppingafterprocessing
>Configureproject:
NewDep:net.minecraftforge:forge:1.12.2-14.23.5.2855_mapped_snapshot_20171003-1.12
FAILURE:Buildfailedwithanexception.
*Whatwentwrong:
Aproblemoccurredconfiguringrootproject'forge-1.12.2-14.23.5.2855-mdk'.
>Invalidpatcherdependency:net.minecraftforge:forge:1.12.2-14.23.5.2855:userdev3
*Try:
Runwith--stacktraceoptiontogetthestacktrace.Runwith--infoor--debugoptiontogetmorelogoutput.Runwith--scantogetfullinsights.
*Getmorehelpathttps://help.gradle.org
DeprecatedGradlefeatureswereusedinthisbuild,makingitincompatiblewithGradle5.0.
Use'--warning-modeall'toshowtheindividualdep
[/code]
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
ShadersforGameProgrammersandArtists(8)-Fog
ShadersforGameProgrammersandArtists(7)-Non-photorealisticrendering
ShadersforGameProgrammersandArtists(6)-反射与折射
2017年5篇
2016年40篇
2015年29篇
2014年50篇
2013年119篇
2012年127篇
2011年64篇
2010年10篇
目录
目录
分类专栏
游戏开发
51篇
Rendering
11篇
OpenGL进阶
19篇
ProcedualGeneration
10篇
MultiplayerGameProgramming
5篇
CharacterCameraControl
2篇
GameDesign
2篇
Physics&Math
12篇
Unity炫酷实战
9篇
计算机图形学
47篇
C&C++
48篇
数据结构与算法
34篇
科研科研
13篇
翻译
22篇
剑指XX游戏
10篇
移动开发
13篇
java
25篇
Android实战
45篇
Ubuntu&Linux
37篇
web开发
10篇
Qt
10篇
读书.游戏.电影.生活
18篇
7788
9篇
目录
打赏作者
拳四郎
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:--)
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值
延伸文章資訊
- 1Stencil testing - LearnOpenGL
A stencil buffer (usually) contains 8 bits per stencil value that amounts to a total of 256 diffe...
- 2Stencil buffer - Wikipedia
A stencil buffer is an extra data buffer, in addition to the color buffer and Z-buffer, found on ...
- 3走进Stencil Buffer 系列0 : 模板缓冲和模板测试是什么?
模板测试(Stencil Test)是现代渲染流水线的一环,其中涉及到的就是模板缓冲(Stencil Buffer),模板缓冲可以用来制作物体的遮罩、轮廓描边、阴影、遮挡 ...
- 4关于Stencil Buffer的一点实践和理解 - 知乎专栏
Stencil buffer概念: ... StencilTest在ZTest之前,两者紧密联系,存在于显存内的某一片区域中。目前的显卡架构中,比如在depth/stencil缓冲区某个32位的...
- 5模版緩衝- 维基百科,自由的百科全书
模版緩衝(stencil buffer)或印模緩衝,是在OpenGL三維繪圖等計算機圖像硬件中常見的除顏色緩衝、像素緩衝、深度緩衝之外另一種數據緩衝。詞源模版(stencil)是指 ...