У меня серьезная проблема с пониманием того, как работает трафаретная буферизация в OpenGL.Я следовал за примерами учебника, и код, конечно, работает, но я действительно не понимаю, в какие моменты я пишу в буфер трафарета.Мне кажется, что я настраиваю трафаретные тесты, маски и все остальное, но затем я просто вызываю glDrawArrays(...)
и записываю треугольники в вывод без применения буфера трафарета вообще.Я также не понимаю, почему я очищаю буфер, используя glClear(GL_STENCIL_BUFFER_BIT)
, прежде чем я даже рисую треугольники.Я был бы очень благодарен, если бы кто-то мог просветить меня.
// Draws the initial cube facing upwards
glDrawArrays(GL_TRIANGLES, 0, 36);
//enable stencil testing
glEnable(GL_STENCIL_TEST);
// Draws the floor between the upward cube and downward cube
glStencilFunc(GL_ALWAYS, 1, 0xFF); /*sets the test function, mask and ref value*/
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); /*defines what happens on restults*/
glStencilMask(0xFF); /*Mask that is applied on the bits before they are written to the stencil buffer*/
glDepthMask(GL_FALSE);
glClear(GL_STENCIL_BUFFER_BIT); /*Why do I clear the buffer here?!?*/
glDrawArrays(GL_TRIANGLES, 36, 6);
// Draws the downward cube (reflection)
glStencilFunc(GL_EQUAL, 1, 0xFF);
glDepthMask(GL_TRUE);
glStencilMask(0x00);
model = glm::scale(
glm::translate(model, glm::vec3(0, 0, -1)),
glm::vec3(1, 1, -1)
);
glUniformMatrix4fv(uniModel, 1, GL_FALSE, glm::value_ptr(model));
glUniform3f(uniColor, 0.3f, 0.3f, 0.3f);
glDrawArrays(GL_TRIANGLES, 0, 36);
glUniform3f(uniColor, 1.0f, 1.0f, 1.0f);
glDisable(GL_STENCIL_TEST);