OpenGL 参考 pdf 中的文档(OpenGL 3.3 和 4.5 规范)对于应用遮罩时存储的模板值会发生什么情况不太清楚。
例如如果我有以下掩码:
glStencilMask( 0x06);
并存储在模板缓冲区中已经有这个值:
0x06
如果模板操作是GL_INCR_WRAP
当在该像素上正确调用 StencilOp 时会发生什么?
基本上我有面具:
00000110
和价值
00000110
我尝试增加它,它被包裹了吗?
00000010
或者只是归零?(00000110 + 1) & mask
00000000
第 17.4.2 节“缓冲区更新的精细控制”OpenGL 4.5 核心配置文件规范 states:
命令void StencilMask( uint mask );
void StencilMaskSeparate( enum face, uint mask );
控制将特定位写入模板平面。
最低有效 s 位mask
,其中 s 是模板缓冲区中的位数,指定整数掩码。当此掩码中出现 1 时,将写入模板缓冲区中的相应位;出现 0 时,该位未被写入。
The glStencilMask()
参数控制哪些位平面written到模板缓冲区。它不控制读取什么内容或如何读取glStencilOp
运行。
第 17.3.5 节“模板测试”指出(我的重点):
为了递增和递减的目的,模板位被视为
无符号整数。通过饱和度来增加或减少模板
0 处的值和最大可表示值。在不饱和的情况下递增或递减将换行,使得增加最大可表示值会导致 0,递减 0 会得到最大可表示值。
模板掩模本身与管道的该阶段无关。它仅在片段最终写入帧缓冲区时应用,就像所有一样gl*Mask()
功能。
所以具有价值0110
在缓冲区中并应用GL_INCR_WRAP
导致0111
当将其写入缓冲区时,将应用掩码,因此您基本上最终会得到0110
再次(而不是 0)。
另请注意,还有一个mask
参数输入glStencilFunc()
定义在模板测试之前应用的位掩码。再次引用17.3.5节:(我的重点):
StencilFunc
and StencilFuncSeparate
采用三个控制参数
模板测试是否通过。ref
是用于无符号模板比较的整数参考值。模板比较操作和查询ref
将其值限制在范围 [0; 2^s - 1],其中 s 是附加到绘制帧缓冲区的模板缓冲区中的位数。s 的最低有效位mask
与参考值和存储的模板值按位与运算,得到的屏蔽值是参与由控制控制的比较的值func
.
因此,如果您想将 a 环绕为某个值 2^n-1,您可以简单地忽略模板缓冲区中的附加位,并仅在模板测试中测试这些位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)