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_TEST
或 GL_DEPTH_TEST
实际上会做两件事:
-
禁用测试
禁用写入模板/深度值
因此,如果出于某种原因,您曾经想编写一个恒定的深度或模板值,并且您认为禁用测试会实现这一点——它不会。如果这是您的意图,请使用 GL_ALWAYS
进行测试功能,而不是禁用测试。
【讨论】:
以上是关于glStencilMask() 到底是做啥的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章