opengl - learn - ¿Cómo afecta la máscara el valor de la plantilla de acuerdo con la plantilla op?
learn opengl (1)
La Sección 17.4.2 "Control preciso de actualizaciones de búfer" de la especificación de perfil de núcleo de OpenGL 4.5 indica:
Los comandos
void StencilMask( uint mask );
void StencilMaskSeparate( enum face, uint mask );
controlar la escritura de bits particulares en los planos de la plantilla. Los bits menos significativos de lamask
, donde s es el número de bits en el búfer del esténcil, especifican una máscara entera. Donde aparece un 1 en esta máscara, se escribe el bit correspondiente en el búfer del esténcil; donde aparece un 0, el bit no está escrito.
El parámetro glStencilMask()
controla qué planos de bits se escriben en el búfer del esténcil. No controla lo que se lee o cómo funciona glStencilOp
.
Sección 17.3.5 "Prueba de Stencil" (mi énfasis)
Para propósitos de incremento y decremento, los bits de plantilla se consideran como un entero sin signo. Al aumentar o disminuir con saturación, se fija el valor de la plantilla en 0 y el valor máximo representable. Incrementando o disminuyendo sin saturación se ajustará de tal manera que incrementar el máximo valor representable resulta en 0 , y la reducción de 0 resulta en el valor máximo representable.
La máscara de estarcido en sí no es relevante en esa etapa de la tubería. Solo se aplica cuando el fragmento se escribe finalmente en el framebuffer, como todas las funciones gl*Mask()
.
Así que tener el valor 0110
en el búfer y aplicar GL_INCR_WRAP
lleva a 0111
y cuando se escribe el búfer, se aplica la máscara, por lo que básicamente terminas con 0110
(y no con 0).
También tenga en cuenta que también hay un parámetro de mask
en glStencilFunc()
define una máscara de bits que se aplicará antes de la prueba de esténcil. Citando de nuevo la sección 17.3.5: (mi énfasis):
StencilFunc
yStencilFuncSeparate
toman tres argumentos que controlan si la prueba de plantilla pasa o falla.ref
es un valor de referencia entero que se usa en la comparación de galería de símbolos sin firmar. Las operaciones de comparación de plantilla y las consultas deref
sujetan su valor al rango [0; 2 ^ s - 1], donde s es la cantidad de bits en el búfer del estarcido adjunto al framebuffer de draw. Los bits demask
menos significativos se procesan en AND con la referencia y el valor del esténcil almacenado, y los valores enmascarados resultantes son los que participan en la comparación controlada por elfunc
.
Por lo tanto, si desea ajustar un valor 2 ^ n-1, simplemente puede ignorar los bits adicionales en el búfer del esténcil y simplemente probar estos bits en la prueba del esténcil.
La documentación en el pdf de referencia de OpenGL (ambas especificaciones OpenGL 3.3 y 4.5) no es muy clara acerca de lo que sucede con el valor de galería de símbolos almacenado cuando se aplica una máscara.
En el ejemplo Si tengo la siguiente máscara:
glStencilMask( 0x06);
y almacenado en el buffer de la plantilla ya existe este valor:
0x06
Si la operación de GL_INCR_WRAP
símbolos es GL_INCR_WRAP
¿Qué debería pasar cuando StencilOp se invoca correctamente en ese píxel?
Básicamente tengo la máscara:
00000110
y el valor
00000110
y trato de incrementarlo, ¿está envuelto?
00000010
o solo es cero? (00000110 + 1) & mask
00000000