tutorial learn color opengl stencil-buffer

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 la mask , 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 y StencilFuncSeparate 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 de ref 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 de mask 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 el func .

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