Я планирую нарисовать прямоугольник с отверстием в его центре. Я пытаюсь использовать тест трафарета, но не могу заставить его работать. Ниже вы можете увидеть, как я это делаю.
glEnable(GL_STENCIL_TEST);
glColorMask(GL_FALSE,GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS, 2, ~0);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
// Draw the rectangle here
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_EQUAL, 2, ~0);
glStencilOp(GL_INCR, GL_INCR, GL_INCR);
Что я здесь не так делаю? Любая помощь будет высоко ценится! 🙂
Я предполагаю, что ваша ситуация такова, что у вас уже есть что-то нарисованное в кадровом буфере, и теперь вы хотите нарисовать прямоугольник с отверстием в нем, чтобы оно не покрывало то, что находится под отверстием, а покрывало то, что не было под отверстием. часть.
Логично, это означает, что вы сначала рисуете отверстие в буфер трафарета, а затем используйте тест трафарета для исключать эти фрагменты при рисовании прямоугольника.
В коде это выглядит примерно так:
glEnable(GL_STENCIL_TEST);
// Fill stencil buffer with 0's
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
// Write 1's into stencil buffer where the hole will be
glColorMask(GL_FALSE,GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
drawHoleShape();
// Draw rectangle, masking out fragments with 1's in the stencil buffer
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
glStencilFunc(GL_NOTEQUAL, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
drawRectangle();
// Cleanup, if necessary
glDisable(GL_STENCIL_TEST);
Конечно, вы можете использовать 2
(или любой другой бит / значение трафарета) вместо 1
,
Других решений пока нет …