Фрагментный шейдер работает только для видимых фрагментов? - PullRequest
0 голосов
/ 18 мая 2019

Нам нужно написать raytracer в OpenGL.Теперь я решил, что буду стрелять лучом для каждого вызова фрагментного шейдера, поскольку, насколько я понимаю, фрагмент - это пиксель экрана, на который может записываться объект геометрии.Поэтому мне было интересно, будет ли фрагментный шейдер работать только для видимых пикселей или для всех пикселей.Если бы он работал только для видимых, это было бы с учетом того, что первичный луч (от экрана к объекту) не заблокирован.Это спасло бы много вычислений.

1 Ответ

2 голосов
/ 18 мая 2019

Нет абсолютно никакой гарантии, что выполнение фрагментного шейдера означает, что фрагмент, безусловно, виден.

Ранний тест глубины сам по себе не спасет вас.Рендеринг каждого треугольника спереди назад не спасет вас;в OpenGL нет гарантии, что фрагменты генерируются по порядку (только «как будто» по порядку).И это игнорирует случаи наложения, когда невозможно правильно упорядочить.Даже выдача каждого треугольника в отдельной команде рендеринга гарантирует ничто в том, что касается OpenGL.

Единственное, что вы можете сделать, чтобы убедиться, что это выполнить предварительный проход глубины.То есть визуализируйте всю сцену, но без активного шейдера фрагмента (и отключите цветную запись в кадровый буфер).Это запишет все данные глубины в буфер глубины.Таким образом, если вы используете ранние тесты глубины, когда вы снова визуализируете свою сцену, единственные фрагменты, которые проходят тест глубины, будут видимыми.

Предварительные проходы глубины могут быть довольно быстрыми, в зависимости от вашеговершинный шейдер и другие аспекты вашего конвейера рендеринга.

...