Ранняя трафаретная отбраковка без ранней Z выбраковки - PullRequest
2 голосов
/ 11 июля 2019

У меня уже есть идея ответа, но я должен быть уверен.

Я отрисовываю сцену в два прохода.На первом проходе, если проверка глубины прошла успешно, я отмечаю бит трафарета как 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 во втором шейдере ...

1 Ответ

4 голосов
/ 11 июля 2019

Ранних тестов трафарета не существует.Или ранние тесты Z / глубины по этому вопросу.Есть только ранний фрагмент тесты , которые включают тесты трафарета и глубины, но также и другие операции.Они не могут быть выполнены рано по частям;все рано или поздно.

...