Stencil buffer_拳四郎的博客

文章推薦指數: 80 %
投票人數:10人

模版缓冲(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币套餐、付费专栏及课程。

余额充值



請為這篇文章評分?