Решение № 1:
- Отображать все непрозрачные объекты первыми в любом порядке, буфер глубины включен.Это включает в себя все объекты, которые используют альфа-тестирование без альфа-смешивания.
- Для
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
объектов (дым / стекло / трава): рендеринг прозрачной сцены из самого дальнего многоугольника в ближайший многоугольник с отключенной записью в буфер глубины (glDepthMask(GL_FALSE)
).Если все прозрачные объекты являются выпуклыми и не пересекаются, вы можете сортировать объекты вместо полигонов. - Для
glBlendFunc(GL_SRC_ALPHA, GL_ONE)
и glBlend(GL_ONE, GL_ONE)
(огонь, «магические» системы частиц, свечение): визуализация прозрачной сцены в любомпорядок с записью в буфер глубины (glDepthMask(GL_FALSE)
) отключен. - Не визуализировать объекты с поддержкой буфера глубины после шага № 3.
Решение № 2:
Использовать пилинг по глубине (Google google it).Особенно, если прозрачные объекты пересекаются друг с другом.Не подходит для систем частиц и травы, для которых требуется решение № 1.
, а затем вручную сортировать их на ЦП практически каждый кадр
Вставка сортировкиотлично работает для уже отсортированных или частично отсортированных данных.
Должен быть способ делегировать это в графический процессор ...
Я думаю, вы можете генерировать полигоны травы(в правильном порядке) в геометрическом шейдере с использованием текстуры, имеющей канал (скажем, альфа), который маркирует области с травой и без нее.Требуется OpenGL 4, и вам, вероятно, придется выполнить какую-то высокоуровневую сортировку для полигонов, которые вы будете подавать в шейдер для создания участков травы.
Отдельные кусты можно вращать в вершинном шейдере (на + - 90/ 180/270 градусов) для поддержания правильного порядка многоугольников, если они абсолютно симметричны во всех направлениях.
И есть алгоритм сортировки слиянием, который хорошо распараллеливается и может быть выполнен на GPU, используя подход GDGPU или OpenCL / CUDA.
Однако использование чего-то подобного для рендеринга 5 кустов травы примерно эквивалентно попытке убить таракана с помощью гранатомета - забавная вещь, но не совсем эффективная.
Я предлагаю забыть о «разгрузке на GPU», пока вы действительно не столкнетесь с проблемой производительности.Используйте профилировщики и всегда измеряйте их перед оптимизацией, иначе вы потратите большое количество времени на разработку ненужных оптимизаций.