Поведение буфера трафарета в простом случае (GL_ALWAYS, GL_LEQUAL)

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

myShader.Use() // Use shader program
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// define model, projection, view, ....
glBindVertexArray(VAO[0]);
glStencilMask(0xFF); // Enable stencil buffer writing
glStencilFunc(GL_ALWAYS, 1, 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
drawCube(&myShader, model, projection, view);
glBindVertexArray(0);

Очевидно, мой куб оказывает в этом случае.

Однако, если я использую этот код, то ничего не рендерится вообще

myShader.Use() // Use shader program
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// define model, projection, view, ....
glBindVertexArray(VAO[0]);
glStencilMask(0xFF); // Enable stencil buffer writing
glStencilFunc(GL_LEQUAL, 1, 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
drawCube(&myShader, model, projection, view);
glBindVertexArray(0);

Если в моей сцене только один объект, оба кода должны вести себя одинаково. Тем не менее, это не так.

Я думал, что это как-то связано со значением по умолчанию в буфере трафарета. Однако, поскольку я очищаю буфер трафарета перед этим, значение по умолчанию должно быть 0.

Кстати, с этим кодом, куб также рендерит:

myShader.Use() // Use shader program
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// define model, projection, view, ....
glBindVertexArray(VAO[0]);
glStencilMask(0xFF); // Enable stencil buffer writing
glStencilFunc(GL_LEQUAL, 0, 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
drawCube(&myShader, model, projection, view);
glBindVertexArray(0);

Я не понимаю, что происходит.

1

Решение

glStencilFunc(GL_LEQUAL, 1, 0xFF) средства if 1 <= 0, потому что буфер трафарета содержит 0, так как вы очистили его. Ссылочное значение равно 1, потому что вы передаете это значение в функцию. Это всегда терпит неудачу.

Смотрите справочную страницу Хронос (glStencilFunc):

GL_LEQUAL Пропуска if ( ref & mask ) <= ( stencil & mask ),

2

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

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

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