Будет ли мой буфер глубины обновляться глубиной фрагмента до того, как будет выполнено ключевое слово discard?
Нет, такое поведение явно запрещено в шейдере, который содержит discard
или записывает произвольное значение в gl_FragDepth
. Это связано с тем, что в таком шейдере глубина вашего фрагмента после его затенения может быть не связана с позицией, сгенерированной во время начальной растеризации (предварительного затенения).
Без записи в gl_FragDepth
или отбрасывания глубина фрагмента фактически известна задолго до фактического выполнения фрагментного шейдера, и это формирует основу для ранних тестов глубины. Растеризацию/затенение можно пропустить для некоторых (отдельных мозаичных областей) или всего примитива, если можно определить, что он не прошел бы проверку глубины до фрагментного шейдера. оценивается, но если сам фрагментный шейдер определяет глубину фрагмента, то все ставки сняты.
В DX11/OpenGL 4.x есть исключение из этого правила. Если вы пишете свои шейдеры таким образом, что вы можете гарантировать, что выходная глубина всегда будет сохранять результат теста глубины (тот же результат, что и глубина, сгенерированная во время растеризации), можно включить ранние тесты фрагментов в шейдере, который использует discard
или записывает до gl_FragDepth
. Эта функция известна как консервативная глубина, и если вы не используете это, обычно понимается, что discard
нарушит раннюю оптимизацию глубины по всем направлениям.
Теперь, поскольку вы никогда не должны записывать в буфер глубины, пока не узнаете, проходит ли записываемое вами значение тест глубины или нет (gl_FragDepth
может быть другим) или фрагмент вообще выживает (может использоваться discard
), вы можете понять, почему примитив, затененный фрагментным шейдером, который содержит discard
, не может выполнять запись в буфер глубины до того, как шейдер будет оценен.
person
Andon M. Coleman
schedule
07.11.2013