2015-07-25 3 views
2

OpenGL говорит, что если функция глубины GL_LESS и спецификатор макета - depth_less, то OpenGL будет выполнять раннее тестирование глубины.Общие сведения об расширении GL_ARB_conservative_depth

Теперь, если исходное значение в буфере равно 0,5 и если глубина для конкретного пикселя равна 0,8, это приведет к отказу от теста на раннюю глубину. Но если мы изменяем значение до 0,4, это не должно терпеть неудачу. Как это работает в этом случае?

+0

Есть ли у вас ссылка на то, что GL_LESS и depth_less приведет к раннему тестированию глубины? По крайней мере, в спецификации [ARB] (https://www.opengl.org/registry/specs/ARB/conservative_depth.txt) я не могу найти никакого намека на это. – BDL

ответ

4

Я не думаю, что сочетание значений в вашем вопросе имеет смысл. С помощью функции сравнения (по умолчанию) GL_LESS глубины, вы должны использовать:

layout (depth_greater) out float gl_FragDepth; 

по-прежнему позволяет раннее тестирование глубины. С помощью этой декларации вы гарантируете, что если вы измените значение глубины в шейдере, вы увеличите его размер.

С функцией сравнения GL_LESS фрагменты, которые не пройдут проверку глубины, будут иметь значения глубины, превышающие текущее значение в буфере глубины. Это означает, что тест ранней глубины может быть использован без влияния на результат с depth_greater:

  • Если тест ранней глубины применяется, она исключает фрагменты с глубиной большей, чем текущее значение до фрагмента шейдер.
  • Если тест ранней глубины не применяется, фрагмент будет обрабатываться фрагментарным шейдером. Поскольку гарантируется, что шейдер фрагмента будет только увеличивать значение, он будет по-прежнему больше, чем текущее значение глубины, и будет устранено с помощью теста глубины после шейдера фрагмента.

Совершенно правомерно использовать любой классификатор макета с любой функцией глубины. Но если вы используете:

layout (depth_less) out float gl_FragDepth; 

с GL_LESS, это на самом деле не помогает, и тестирование рано глубина не будет использоваться.

+0

С depth_greater, если значение в буфере 0,4, а глубина пикселя - 0,2, это пройдет тест на раннюю глубину, но если мы изменим глубину до 0,5 в FS, тогда? – debonair

+0

Затем он завершит окончательную проверку глубины после фрагментарного шейдера. Ранняя проверка глубины не обязательно является заменой окончательной проверки глубины. Это просто оптимизация, чтобы избежать выполнения фрагментарного шейдера для фрагментов, которые будут невидимыми. Что необходимо предотвратить, так это то, что ранний тест глубины не удался для фрагментов, которые были бы видны. Противоположность, где ранний тест глубины проходит для фрагментов, которые становятся невидимыми, безвреден. –

+0

Я был в предположении, что проверка глубины происходит только один раз. – debonair

Смежные вопросы