Я не понимаю, почему эти два кода не дают одинакового результата. Я включил глубинное и трафаретное тестирование, и мой основной цикл выглядит так:
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);
Я не понимаю, что происходит.
glStencilFunc(GL_LEQUAL, 1, 0xFF)
средства if 1 <= 0
, потому что буфер трафарета содержит 0, так как вы очистили его. Ссылочное значение равно 1, потому что вы передаете это значение в функцию. Это всегда терпит неудачу.
Смотрите справочную страницу Хронос (glStencilFunc
):
GL_LEQUAL
Пропускаif ( ref & mask ) <= ( stencil & mask )
,
Других решений пока нет …