Буферы трафарета, кажется, не работают должным образом

Я пишу SDL2/ современное приложение OpenGL, которое использует трафаретные буферы. Я написал следующий код в моем рендерере:

glEnable(GL_STENCIL_FUNC);
glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glStencilFunc(GL_NEVER, 1, 0xFF);  //Always fail the stencil test
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);   //Set the pixels which failed to 1
glStencilMask(0xFF);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

//Drawing small rectangle here

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

glStencilFunc(GL_EQUAL, 1, 0xFF);   //Only pass the stencil test where the pixel is 1 in the stencil buffer
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);   //Dont change the stencil buffer any further

//Drawing big rectangle here

glDisable(GL_STENCIL_FUNC);

Цель приведенного выше кода - нарисовать только часть большого прямоугольника, которая помещается в маленький прямоугольник. К сожалению, когда я запускаю код, происходит обратное, он рендерит большой прямоугольник с отверстием размером с маленький прямоугольник.

Я перепробовал еще много функций трафарета, но все они приводят к одному и тому же результату, и похоже, что он должен работать. Так, у кого-нибудь есть какие-нибудь идеи или можете сказать мне, где я иду не так?

У меня, к сожалению, нет репутации, чтобы вставлять картинки в мой пост, но:

Предполагаемый результат: http://i.imgur.com/RpbHzCV.jpg Фактический результат: http://i.imgur.com/Z5qDqHk.jpg

1 ответ

Решение

Вызов glEnable(GL_STENCIL_FUNC); просто неправильно, правильное перечисление GL_STENCIL_TEST, Таким образом, ваш код вообще не использует трафаретный буфер.

Я могу только догадываться, почему вы получаете полученный результат: ваш код может нарисовать первый прямоугольник в буфере глубины, поэтому, когда вы рисуете второй, фрагменты в этой области могут не пройти тест глубины. Поэтому, даже если вы правильно включите проверку трафарета, вам все равно придется позаботиться о буфере depht здесь.

Другие вопросы по тегам