什么是模板缓冲区?


26

维基百科指出,模板缓冲区是着色器可以使用的任意缓冲区。

但是,它暗示它用于裁剪或“紧密绑定”深度和像素缓冲区,这与自身有些矛盾。

模板缓冲区实际上起什么作用,在现代应用中如何实际使用?

Answers:


31

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

模具是一种模板,每次使用时都会绘制或绘制相同的字母,符号,形状或图案。由这种模板产生的设计也称为模板。

那就是在计算机图形学之前模具的意思。如果您在Google图片上输入模具,这是第一个结果之一:

模具模板

如您所见,它只是一个遮罩或图案,可用于将图案的底片“绘制”到某物上。

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


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

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


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


这是一个字符,但是cleaver-> clever。我无法对其进行编辑D:好的答案,到目前为止,这是最有意义的。
Qix

3
如果您拥有昂贵的每像素着色器,则可以使用模板缓冲区来批处理相似的线程,从而减少差异并增加占用率,如本OIT论文sec 2.6中所述(免责声明:我是作者)。
jozxyqk 2015年

@jozxyqk,有些人在想什么!非常好。
glampert

13

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

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

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

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

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

过去,它还用于阴影技术,例如“阴影体积”。

较差的模板缓冲区通常被低估了,但是在图形程序员的工具库中可能是一个很好的武器。

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

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


6

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

模板缓冲区的操作类似于深度缓冲区。同样,模板数据也存储在深度缓冲区中。深度数据确定哪个像素最接近相机时,模版数据可以用作更通用的每像素掩码,以保存或丢弃像素。若要创建遮罩,请使用模板功能将每次渲染像素时将参考模板值(全局值)与模板缓冲区中的值进行比较。

来源:什么是模板缓冲?| Microsoft开发人员网络

总的想法是,可以设置每个像素的值,然后设置操作(GREATERSMALLEREQUAL等等),当这个计算结果为True的像素被遮蔽,并示出。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.