Wikipedia指出,模版缓冲区是着色器可以使用的任意缓冲区。 br />
模版缓冲区实际上起什么作用,在现代应用中如何实际使用?

#1 楼

维基百科上的模板缓冲区定义确实不是很好,它过多地关注了现代实现(OpenGL)的细节。我发现消除歧义的版本更容易理解:


模板是一种模板,用于在每次使用时绘制或绘制相同的字母,符号,形状或图案。这样的模板所产生的设计也称为模具。如果您在Google图片上输入模具,这是第一个结果:将图案的底片“绘制”到某物上。

模板缓冲区的工作方式完全相同。可以通过执行模板渲染过程,用选定的图案填充模板缓冲区,然后设置适当的模板功能,该功能将定义如何在后续图形上解释图案,然后渲染最终场景。根据比较功能,不会绘制掉落到模板遮罩拒绝区域中的像素。


实现模板缓冲时,有时确实与深度缓冲区。大多数图形硬件使用1字节(8位)的模版缓冲区,对于大多数应用程序而言已足够。深度缓冲区通常使用3个字节(24位)实现,对于大多数3D渲染来说,这通常就足够了。因此,将模板缓冲区的8位与深度缓冲区的其他24位打包在一起是合乎逻辑的,从而可以将每个深度+模板像素存储为32位整数。这就是Wikipedia的意思:


深度缓冲区和模板缓冲区通常在图形硬件的RAM中共享同一区域。



模板缓冲区曾经是国王的一个应用程序是用于阴影渲染,这种技术称为阴影体积,有时也称为模板阴影。这是对缓冲区的非常巧妙的使用,但是如今,大多数渲染字段似乎已转向基于深度的阴影贴图。

评论


$ \ begingroup $
这是一个角色,但切肉刀->聪明。我无法对其进行编辑D:好的答案,到目前为止,这是最有意义的。
$ \ endgroup $
– Qix-蒙尼卡(MS)被盗
15年8月4日在19:54



$ \ begingroup $
如果您有昂贵的每像素着色器,则可以使用模板缓冲区来批处理相似的线程,如本OIT论文2.6节中所述,以减少差异并增加占用率(免责声明:我是作者)。
$ \ endgroup $
– jozxyqk
15年8月10日在5:45

$ \ begingroup $
@jozxyqk,有些人在想什么!非常好。
$ \ endgroup $
–glampert
15年8月10日在19:05

$ \ begingroup $
请问,整个GPU是否有单个模板和深度缓冲区?还是为我们绘制的每个对象分配了一个不同的对象?
$ \ endgroup $
– Nikos
20-11-15在14:21

#2 楼

模板缓冲区是无符号整数缓冲区,如今通常是8位,您可以在模板测试后根据各种操作(例如此处的OpenGL Ops)的使用,根据需要填充每个像素的信息。

模板测试只是按像素进行的操作,其中将针对模板缓冲区的内容测试当前像素模板值。您设置模板测试通过的条件(例如,始终,更少等)。

您可以根据测试结果决定模具值的变化(在OpenGL中,使用我上面链接的操作)

模具缓冲区有很多用途,首先想到的是:


它可用作遮罩,有选择地渲染帧缓冲区的某些部分并丢弃其余部分。例如,这对于反射很有用,但还有很多其他用途。处理多分辨率渲染时,可以将其标记为需要以更高分辨率渲染的边缘。确实有很多掩盖用法。
例如一个非常简单的透支过滤器。您可以将模板测试设置为始终通过并始终增加该值。最终在模板缓冲区中获得的值表示您的透支。 [*]

过去,它还用于阴影技术,例如“阴影”体积。在图形程序员的军械库中。

[*]使用正确的SRV在后处理中回读的值!

编辑:
另外,值得一提的是,在Shader Model 5.1(即D3D11.3和D3D12)中,您可以通过SV_StencilRef访问模具参考值

#3 楼


模板缓冲区包含每个像素的整数数据,该数据用于添加对渲染像素的更多控制。

模板缓冲区的操作类似于深度缓冲区。因此,类似地,模板数据存储在深度缓冲区中。深度数据
确定哪个像素最接近摄影机时,模版数据可以用作更通用的每像素掩模,以保存或丢弃像素。若要创建蒙版,请使用模板功能将每次渲染像素时将
参考模板值(全局值)与
模板缓冲区中的值进行比较。 />
来源:什么是模板缓冲区? | Microsoft开发人员网络

一般的想法是,您可以为每个像素设置一个值,然后设置操作(GREATERSMALLEREQUAL等),当评估结果为true时,该像素将被阴影显示。

一个应用程序是实时反射,当渲染反射纹理时,模版缓冲区用于为应用反射的位置创建蒙版。例如,仅将反射应用于玻璃材质阴影三角形。它也可以用于为整个帧缓冲区创建任意二维蒙版。