OpenGL: очистить буфер трафарета, кроме определенных битов?

Я использую трафаретный буфер для двух заданий. Первый — разрешить маскирование, а второй — написать маски для объектов, которые можно «увидеть» насквозь. В этом конкретном случае зарезервированный бит 0x80последний бит в байте, остальное осталось для обычной маскировки.

Первая цель требует, чтобы буфер очищался примерно после 127 использований, иначе прошлые трафареты снова станут «действительными» при тестировании, поскольку значение должно возвращаться к 1. Вторая цель требует, чтобы зарезервированные биты в буфере оставались в живых до конца. весь кадр.

Есть ли способ очистить весь буфер трафарета, сохранив зарезервированные биты?

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);
1

Другие решения


По вопросам рекламы [email protected]