Как замаскировать OpenGL Quad с другим Quad - PullRequest
1 голос
/ 27 октября 2019

Я пытаюсь отобразить квад, но только тогда, когда он находится над другим квадратом, положение которого я знаю. Я думал об использовании этого четырехугольника в качестве маски для другого четырехугольника, но я не уверен, как это сделать (я уже нашел этот пост, в котором говорится о маскировании, однако в моем случае у меня неттекстура маски; я знаю только X, Y, ширину и высоту области маскировки). Текущее решение, которое я нашел, состоит в том, чтобы использовать glBlendFunc, и оно работает только в том случае, если я ничего не отрисовываю за этим, что не произойдет позже.

glBlendFunc(GL_ONE, GL_ZERO);
// draw the background quad, that is acting as the mask...
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_ALPHA, GL_ZERO);
// draw the background quad again, this time it will act as a mask...
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
// draw the quads that will be masked...
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // this is the blend func used for the rest of the rendering

Перед рисованием каждого кадра,У меня также есть функция, которая очищает экран:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0,0,0,0);

Как я могу сделать так, чтобы что бы я ни рисовал до этого, оно будет маскироваться только на предыдущем кваде?

1 Ответ

1 голос
/ 27 октября 2019

Если вы хотите ограничить рендеринг прямоугольной областью, вы можете использовать Тест ножниц .
Тест ножниц должен быть включен (GL_SCISSOR_TEST) aая прямоугольная область может быть установлена ​​с помощью glScissor. Например:

glEnable(GL_SCISSOR_TEST);
glScissor(x, w, width, height);   
...