У меня возникают проблемы при рисовании с использованием теста трафарета в OpenGL на Mac. Когда я впервые рисую сцену, трафарет работает отлично. Я рисую полупрозрачный черный прямоугольник посередине, с включенной записью в буфер трафарета, а затем большой синий прямоугольник с отключенной записью в буфер трафарета. Я получаю правильный результат, когда впервые появляется окно, которое выглядит так:
Однако, когда я изменяю размер окна, и функция рендеринга вызывается снова, я получаю результат, который выглядит следующим образом:
Иногда странное пустое пространство следует за средним прямоугольником, иногда белая защелка между кажущимися случайными расположениями, но сохраняет эти расположения, когда вы возвращаетесь к тому размеру окна. Я не могу найти решение этой проблемы онлайн. Вот моя функция рендеринга, которая вызывается каждый раз, когда размер окна изменяется:
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, поэтому нормально не очищать буфер глубины (я проверял это).
Очистка буфера трафарета действительно не работает (за исключением самого первого вызова функции), как вы могли ожидать.
Что вы пропустили, так это то, что glStencilMask
также повлияет glClear(... | GL_STENCIL_BUFFER_BIT)
,
Вы должны переместить glStencilMask(0xFF)
немного, прежде чем сделать четкий звонок.
Других решений пока нет …