Проблема при обновлении буфера трафарета в OpenGL

У меня возникают проблемы при рисовании с использованием теста трафарета в OpenGL на Mac. Когда я впервые рисую сцену, трафарет работает отлично. Я рисую полупрозрачный черный прямоугольник посередине, с включенной записью в буфер трафарета, а затем большой синий прямоугольник с отключенной записью в буфер трафарета. Я получаю правильный результат, когда впервые появляется окно, которое выглядит так:

Правильный (начальный) рендеринг

Однако, когда я изменяю размер окна, и функция рендеринга вызывается снова, я получаю результат, который выглядит следующим образом:

Пример выпуска № 1 или же Пример выпуска № 2

Иногда странное пустое пространство следует за средним прямоугольником, иногда белая защелка между кажущимися случайными расположениями, но сохраняет эти расположения, когда вы возвращаетесь к тому размеру окна. Я не могу найти решение этой проблемы онлайн. Вот моя функция рендеринга, которая вызывается каждый раз, когда размер окна изменяется:

glClearColor(0, 0, 0, 1);
glClearStencil(0x00);
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

// Replace data in the stencil buffer with 1s if it passes the test
//  which should be GL_ALWAYS
glStencilFunc(GL_ALWAYS, 1, 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

// Allow data to be written to the stencil buffer.
glStencilMask(0xFF);

p->fillSquare(1, 1, 1, 0.3, -0.25, 0.25, 0.25, 0.25, -0.25, -0.25, 0.25, -0.25); // Write a semi transparent black rectangle

glStencilMask(0x00); // Disable writing to the stencil buffer.
glStencilFunc(GL_NOTEQUAL, 1, 0xFF); // Only draw if stencil value is 1.

// Draw blue rectangle
p->fillSquare(0.60, 0.60, 0.80, 1, -0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5);

glfwSwapBuffers(w);

Если вы хотите знать, p->fillRect() принимает четыре числа с плавающей точкой для цвета RGBA прямоугольника, а затем координаты x и y каждой вершины.

Кажется, что при очистке трафарета может возникнуть какая-то проблема, но я действительно не уверен. У меня действительно включен тест трафарета в моей функции инициализации OpenGL.
Если вам нужно что-то узнать о других аспектах моего кода или системы, не стесняйтесь комментировать.

Замечания: Я не использую глубину OpenGL, поэтому нормально не очищать буфер глубины (я проверял это).

2

Решение

Очистка буфера трафарета действительно не работает (за исключением самого первого вызова функции), как вы могли ожидать.

Что вы пропустили, так это то, что glStencilMask также повлияет glClear(... | GL_STENCIL_BUFFER_BIT),
Вы должны переместить glStencilMask(0xFF) немного, прежде чем сделать четкий звонок.

5

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

Других решений пока нет …

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