glStencilMask() 到底是做啥的? [复制]

Posted

技术标签:

【中文标题】glStencilMask() 到底是做啥的? [复制]【英文标题】:What exactly does glStencilMask() do? [duplicate]glStencilMask() 到底是做什么的? [复制] 【发布时间】:2015-07-27 18:38:33 【问题描述】:

我是 OpenGL 的初学者,在学习模板时一直困扰着我 (glStencilMask)。

有人告诉我它可以用来启用或禁用模板,这是怎么回事?

为什么要向这个函数传递十六进制值?

为什么HEX值0xff和0x00经常是专门传的?

此功能是否会阻止绘制到颜色缓冲区和/或模板缓冲区?

您能用简单的术语解释一下它的作用吗?

【问题讨论】:

在向颜色缓冲区绘制某些内容时,模板用作蒙版。类似于服装模板技术。如果您为该功能设置 0,它将阻止所有内容。 1 将接受任何着色。任何其他值都会进行bitwise 比较。这就是我记得的方式,不幸的是我现在没有时间检查它。 您阅读文档了吗? 【参考方案1】:

您知道位掩码的工作原理吗?就是这样。

0xff 是二进制的 11111111。这意味着 GL 可以写入所有 8 个模板位。

0x00是二进制的00000000,使用此掩码时不允许GL写入任何位。

由于模板缓冲区实际上是一台大型按位机器,因此您可以很好地复习或详细学习这些概念。如果您无法理解为什么要屏蔽某些位,则可能无法有效利用模板缓冲区。

在传递之间屏蔽某些位将使您保留存储在模板缓冲区中的部分结果。为什么要这样做完全是特定于应用程序的,但这就是模板缓冲区的工作原理。


模板掩码永远不会完全禁用模板缓冲区,您实际上必须为此调用glDisable (GL_STENCIL_TEST)。它只是启用或禁用对其部分的写入。

最后一点,如果您禁用 GL_STENCIL_TESTGL_DEPTH_TEST 实际上会做两件事:

    禁用测试 禁用写入模板/深度值

因此,如果出于某种原因,您曾经想编写一个恒定的深度或模板值,并且您认为禁用测试会实现这一点——它不会。如果这是您的意图,请使用 GL_ALWAYS 进行测试功能,而不是禁用测试。

【讨论】:

以上是关于glStencilMask() 到底是做啥的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

“del”到底是做啥的?

selenium 中的 ime() 到底是做啥的?

DrawShadow 中的 Elevation 到底是做啥的?

.join() 方法到底是做啥的?

.join() 方法到底是做啥的?

Perl 的“祝福”到底是做啥的?