Что такое цвет вершины?

31

Мой вопрос в том, что написано в заголовке. Этот термин "цвет вершины" появляется много. Мне трудно понять это.

Например:

Разве вершина не является простой точкой в ​​трехмерном пространстве? Если так, как точка может иметь цвет? Или этот «цвет» означает что-то еще?

В редакторе материалов нереального движка есть узел "Цвет вершины".

Может кто-нибудь пролить свет на мой вопрос? Я не смог найти ничего полезного, когда гуглил «что такое цвет вершины», кроме документации, которая слишком техническая для меня.

бора
источник
2
В геометрии вершина - это просто точка в пространстве. Но для 3D-рендеринга вы хотите, чтобы все выглядело хорошо, что может означать добавление дополнительной информации к каждой вершине, такой как цвет, или координата текстуры, или скелетные веса, чтобы вы могли легче анимировать сетку или обычное направление для освещения расчеты.
user253751
3
Я думаю, что большая часть вашего замешательства связана с частым сочетанием терминов «вершина» и «положение» в 3D / графике. С математической точки зрения ваше утверждение «Разве вершина не является простой точкой в ​​трехмерном пространстве?» Правильно, но в сфере игровых движков и графики нет, позиция - это простая точка в трехмерном пространстве; и (сетчатая) вершина - это часть данных, которая почти всегда имеет положение, но может также иметь нормальную касательную, координату текстуры, цвет и / или любую из множества других частей данных . Вершина сетки - это просто кусок данных, которые обрабатываются на этапе вершинного рендеринга.
Слипп Д. Томпсон

Ответы:

29

Цвета вершин не так важны, когда у вас полностью текстурированная трехмерная сетка. Но это становится интересным, когда у вас есть нетекстурированная, но цветная сетка. В этом случае вы назначаете цвет каждой вершине. Затем шейдер раскрасит каждый пиксель многоугольника путем интерполяции между цветами трех вершин.

Цвета вершин также иногда могут быть интересны в сочетании с текстурами. Когда вы хотите использовать алгоритм затенения, такой как Gouraud Shading , вы просто вычисляете интенсивность света для каждой вершины, назначаете цвет света для вершины как цвет вершины, и когда вы визуализируете текстуру, вы умножаете значение цвета каждого пикселя текстуры на интерполированные цвета. Это позволяет вам вычислять источники света в вершинном шейдере вместо пиксельного шейдера. Это обычно намного быстрее, потому что вершинный шейдер обычно выполняется гораздо реже.

Philipp
источник
2
Кстати, цвет вершин использовался в некоторых старых играх, в которых не было динамических молний / теней. Например, Ричард Бернс Ралли из 2004 года использует цвет вершин для создания различных текстур и нанесения теней.
Мартин
Свидетель - недавняя игра, в которой широко используются цвета вершин и карты освещения, но не так много текстур.
user253751
@Philipp "потому что вершинный шейдер обычно выполняется гораздо реже" Почему? Разве вершинный шейдер не является частью конвейера рендеринга и, таким образом, выполняется каждый кадр? Почему так реже? Разве вершина «цвет» не должна рассчитываться также для каждого кадра, как если бы она была в пиксельном шейдере?
Никос
1
@Nikos Вершинный шейдер вызывается один раз для каждой вершины. Затем пиксельный шейдер вызывается один раз на пиксель. Полигон с 3-мя вершинами обычно приводит к появлению более 3-х пикселей на экране (если ваша игра рассчитывает много полигонов, которые покрывают менее 3-х пикселей, возможно, вы захотите посмотреть, что вы можете сделать в отношении отбраковки и LOD).
Филипп
25

Теоретически, Vertex Color позволяет раскрасить модель, не заботясь о текстурах. Это довольно часто встречается в САПР.

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

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

"Разве вершина не является простой точкой в ​​трехмерном пространстве?"

Это то, о чем я думал, когда впервые начал работать с 3D. Я быстро понял, что был неправ .

Вы можете думать о вершине как о двоичном объекте данных, который составляет угол треугольника, который вы хотите нарисовать на экране (и ни часть «угла», ни части «треугольника», «рисования» или «экрана» не всегда верны). ). Позиция является одним из опциональных аспектов этого блока данных, который мы называем Vertex.

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

Другие стандартные примеры того, что находится в этом объекте, являются нормалями и касательными. Важно то, что все они являются необязательными, включая позицию. Vertex Color - это только один из этих дополнительных входов, который вы можете использовать или использовать для создания красивой картинки на экране.

Питер
источник
2
«... как большой двоичный объект данных, составляющий грань треугольника», даже это не обязательно. Вершины могут быть отображены как точки просто отлично.
Кромстер говорит, что поддерживает Монику
3
Для некоторых замечательных примеров эффектов шейдера, которых вы можете добиться, используя цвета вершин, я настоятельно рекомендую проверить выступление Натали Бёрк на GDC прошлого года "Animating With Math" (видео в данный момент доступно только для участников, но слайды здесь бесплатны ) , Она показывает, сколько анимаций в экипировке Судьбы, прическе и одежде персонажей и даже частях их врагов и окружения было достигнуто с использованием вершинных шейдеров, которые формировались и контролировались с помощью цветовых каналов вершин.
DMGregory
5
Я бы сказал, что это были не цвета вершин, а атрибуты вершин, показанные в виде цветов для облегчения восприятия.
Кромстер говорит, что поддерживает Монику
В этом разговоре о FortNite есть некоторые аналогичные изобретательские применения вершинных шейдеров , хотя, если я правильно помню, я думаю, что они в основном использовали UV-каналы вершин, а не цветовые каналы.
DMGregory
3
Строго говоря, с точки зрения геометрии / математики вершина - это просто точка в пространстве. «Цвет вершины» - это атрибут, применяемый к вершине «идеей» вершины, используемой графическими процессорами. Это то же самое, что цвет круга или нет. Геометрическая / математическая «идея» круга не имеет цвета, но «идея» круга программного обеспечения для рендеринга ассоциирует цвет с кругом. Таким образом, аргумент @ Kromster является более технически правильным.
Pharap
8

Вершины могут иметь цвета, это свойство, как и обычное.

В трехмерной среде треугольник окрашивается в зависимости от цветовой информации их вершин. Ближайшие фрагменты к вершине A получают ее цвет, а ближе к вершине B - цвет B, а цвет интерполируется между двумя.

Работает так же, как освещение на каждой вершине.

Это простой способ добавить цвета в модель без использования текстуры.

Балинт
источник
+1 за (надеюсь) знакомый пример другого подобного атрибута вершины
AC
Проблема с цветами вершин и нормалями состоит в том, что они предполагают, что вершина является частью сетки (аппроксимация криволинейной поверхности). Если вам нужны острые края или разноцветные грани (например, на кубе), вам нужны отдельные вершины для каждой грани, что значительно увеличивает использование памяти (и замедляет рендеринг).
утра
@aml Вы можете использовать плоский «оператор» в glsl для вывода, чтобы затенение выглядело плоским. Это не то же самое, но это работает.
Балинт
другой интерполированный атрибут: координата текстуры и z-буфер! у нас есть вершинный шейдер, который вычисляет некоторые данные для каждой из 3 вершин треугольника, которые интерполируются при рисовании треугольника на экране (или в некотором буфере), и пиксельный шейдер вызывается с интерполированным значением для каждого нарисованного пикселя
user1952009
@aml Конечно, х2 не является узким местом. И геометрические шейдеры созданы для этого, я бы сказал (например: преобразование текстуры глубины в треугольники )
user1952009
2

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

Изменение цвета объекта (или других атрибутов) в пределах одного вызова партии / отрисовки.

Вы увидите, что это используется при рендеринге систем частиц, текста и пакетных (обычно атласных) спрайтов.

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

Unity, похоже, использует эту технику для изменения цвета частиц, а также для окрашивания отдельных символов в TextMesh или Sprites, визуализированных вместе в пакете.

Я верю, что вы можете сделать что-то похожее с созданием геометрии, но я не знаю, как эти два сравниваются по производительности. Вполне возможно, что в настоящее время такой тип инстансированной настройки с использованием вершинных цветов является скорее задержкой для поддержки аппаратного обеспечения до OpenGL 3.1 / DX9, как некоторые мобильные устройства, нежели передовой практикой для современных ПК. Я приветствовал бы комментарии от людей, которые сделали больше настройки производительности с пакетами и инстансингом, чтобы помочь выяснить, заменили ли эти методы цвета вершин для этой цели. :)

Д.М.Григорий
источник