Как стать автором
Обновить

Комментарии 10

Интересно, а можно ли передать мировые координаты вершины из вершинного шейдера во фрагментный? По-идее, можно любые данные передавать, а они будут интерполированы между вершинами.
В пост процессе у вас всего 2 треугольника чтобы закрасить весь экран. А в растеризации обычных объектов, где много треугольников — да можно.
Конечно, можно! Более того, их и так весьма часто передают.
Но в данном случае это не поможет.

Дело в том, что автор логично хочет, чтобы красивый эффект действовал на всю картинку, а не отдельные объекты сцены, каждый из которых может иметь свой собственный материал. Поэтому не остается ничего, кроме как сделать еще один проход, получающий на вход уже отрендеренную картинку сцены, карту глубины и делающий с ней что-то, «постпроцессинг».
И вот на этой стадии у нас уже нет информации о вершинах сцены, поскольку она превратилась в этакий цветной барельеф.

Прошу прощения, если излишне подробно, скорее всего, Вы и так это знаете, принцип работы постпроцессинга — штука известная, да и в статье все отлично объясняется.
Да нет, спасибо за разъяснения. У меня очень-очень поверхностные знания об OpenGL. Я знаю некие основы, делал некие тестовые вещи, но с трудом представляю, как всё это компонуется в сложные сцены, что мы видим в играх.

Про объекты я не подумал. Получается, что когда мы делаем draw call, передаем данные (индексные, вершинные, текстурные итп буфера) об объекте видеокарте, то на каждый вызов (на каждый объект) у нас будет каждый раз проходить весь пайплайн (вершинный и далее)? Поэтому во фрагментном шейдере получим данные только о текущем объекте?
Обычно да, после draw call видеокарта начинает трудиться и отрисовывать переданные объекты, от трансформации вершин до растериазации. Однако, вызовы асинхронные, поэтому написав где-то в программе glDrawArrays(или что-то в этом духе), мы можем быть уверены только в том, что объекты будут нарисованы в порядке вызовов draw call'ов, а так же в том, что с этого момента наш объект уже в очереди.
По идее, когда графический движок (или откуда мы там дёргаем API) успевает скормить видеокарте новую порцию данных прямо перед моментом завершения отрисовки, никто не простаивает.

Вообще, низковуровневые подробности — очень интересная тема, но я тоже не очень в ней разбираюсь.

На assassin's creed (3, 4, и Odissey как минимум, в других не знаю) похоже, только там ещё и вершинный шейдер используется при загрузке новой локации.

Неужели, даже в новом LightWaight чтобы получить текстуру глубины, сцену нужно отрисовывать 2 раз? И это в 2019 году!!!
Интересный эффект.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории