Я использую трафаретный буфер для двух заданий. Первый — разрешить маскирование, а второй — написать маски для объектов, которые можно «увидеть» насквозь. В этом конкретном случае зарезервированный бит 0x80
последний бит в байте, остальное осталось для обычной маскировки.
Первая цель требует, чтобы буфер очищался примерно после 127 использований, иначе прошлые трафареты снова станут «действительными» при тестировании, поскольку значение должно возвращаться к 1. Вторая цель требует, чтобы зарезервированные биты в буфере оставались в живых до конца. весь кадр.
Есть ли способ очистить весь буфер трафарета, сохранив зарезервированные биты?
Ваша теория в комментарии верна. glStencilMask()
применяется к значениям, написанным glClear()
а также glClearBuffer()
,
Из раздела «17.4.3 Очистка буферов» в спецификации OpenGL 4.5 (выделение добавлено):
Когда вызывается Clear, единственными операциями для каждого фрагмента, которые применяются (если включены), являются тест владения пикселем, тест ножниц, преобразование sRGB (см. Раздел 17.3.9) и дизеринг. Маскирующие операции, описанные в разделе 17.4.2, также применяются.
Где раздел 17.4.2 называется «Точный контроль обновлений буфера», и включает в себя документацию glStencilMask()
, За glStencilMaskSeparate()
, которая является более общей версией glStencilMask()
он даже говорит прямо:
Фрагменты, сгенерированные фронтальными примитивами, используют переднюю маску, а фрагменты, сгенерированные обратными примитивами, используют обратную маску (см. Раздел 17.3.5). Операция очистки всегда использует маску записи переднего трафарета при очистке буфера трафарета.
Таким образом, чтобы очистить нижние 7 бит буфера трафарета, вы можете использовать:
glStencilMask(0x7f);
glClear(GL_STENCIL_BUFFER_BIT);