У меня уже есть идея ответа, но я должен быть уверен.
Я отрисовываю сцену в два прохода.На первом проходе, если проверка глубины прошла успешно, я отмечаю бит трафарета как 1:
glEnable(GL_STENCIL_TEST);
glStencilMask(GL_TRUE);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilFunc(GL_ALWAYS, 1, GL_TRUE);
Второй проход записывает только, где трафарет равен 1:
glStencilFunc(GL_EQUAL, 1, GL_TRUE); // Pass test if stencil value is 1
glStencilMask(GL_FALSE); // Don't write anything to stencil buffer
На самом деле, это работаетправильно, но я ожидал огромного увеличения производительности.Шейдер, используемый во втором проходе, специфичен: он использует эффекты discard
и gl_FragDepth
.Это делает раннюю выборку невозможной.К счастью, меня интересует только ранняя трафаретная отбраковка.
Таким образом, у меня есть вопрос: есть ли способ извлечь выгоду из ранней трафаретной отбраковки без ранней выборки z ?
Этот поток очень связан с этим one , но мне действительно нужно использовать эффекты discard
и gl_FragDepth
во втором шейдере ...