Що таке колір вершин?


31

Моє запитання - що написано в заголовку. Цей термін "колір вершин" з'являється багато. Мені важко це зрозуміти.

Наприклад:

Чи не проста точка вершини на просторі 3D? Якщо так, то як точка може мати колір? Або цей "колір" означає щось інше?

У редакторі матеріалів нереального двигуна є вузол "Колір вершини".

Чи може хтось пролити світло на моє запитання? Я не зміг знайти нічого корисного, коли поглянув "що таке колір вершини", але документації, які занадто технічні для мене.


2
У геометрії вершина - це лише точка у просторі. Але для 3D-рендерінгу ви хочете, щоб речі виглядали красиво, що може означати додавання більше інформації до кожної вершини, наприклад, кольору, координати текстури або скелетних ваг, щоб ви могли легше анімувати сітку або звичайний напрямок, який потрібно використовувати для освітлення розрахунки.
користувач253751

3
Я думаю, що значна частина вашої плутанини пов’язана з частими конфліктами термінів "вершина" та "позиція" в 3D / графіці. Математично ваше твердження «Чи не проста точка вершини на просторі 3D?» Є правильною, але в царині ігрових двигунів та графіки ні, позиція є простою точкою в просторі 3D; а вершина (сітка) - це частина даних, яка майже завжди має положення, але також може мати нормальну, дотичну, текстурну координату, колір та / або будь-яку з численних інших фрагментів даних . Вершина сітки - це лише фрагмент даних, які обробляються на вершинній стадії візуалізації.
Сліп Д. Томпсон

Відповіді:


29

Кольори вершин не такі актуальні, коли у вас повністю текстурована 3d сітка. Але це стає цікавим, коли у вас нетекстурована, але кольорова сітка. У цьому випадку ви присвоюєте колір кожній вершині. Потім шейдер забарвлює кожен піксель багатокутника, інтерполюючи між кольорами трьох вершин.

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


2
btw, колір вершин використовувався в деяких старих іграх, у яких не було динамічних блискавок / тіней. Наприклад, Річард Бернс Раллі з 2004 року використовує кольори вершин для створення різних виглядаючих текстур та нанесення тіней.
Мартін

Свідок - це нещодавня гра, яка широко використовує вершинні кольори та світлові карти, але не багато текстур.
користувач253751

@Philipp ", оскільки вершина шейдера зазвичай виконується набагато рідше" Чому? Хіба вершина шейдера не є частиною конвеєра візуалізації, і таким чином виконується кожен кадр? Чому так рідше? Чи не слід було б "кольором" вершини обчислювати також кожен кадр, як би він був у піксельній шейдері?
Нікос

1
@Nikos Вершина шейдера називається один раз на вершину. Потім піксельний шейдер називається один раз на піксель. Полігон з 3 вершинами зазвичай призводить до більш ніж 3-х пікселів на екрані (якщо ваша гра закінчиться обчисленням багатокутників, які охоплюють менше 3-х пікселів, ви можете розглянути, що ви можете зробити щодо купірування та LOD).
Філіп

25

Теоретично Vertex Color дозволяє розфарбувати модель, не турбуючись із фактурами. Це досить часто в САПР.

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

На практиці це лише ще один слот, який ви можете використовувати для введення даних у вершину, який ви потім використовуєте в шейдері вершин, щоб робити шалені речі .

"Чи не проста точка вершини на просторі 3D?"

Про це я думав, коли вперше почав з 3D. Я швидко дізнався, що помилявся .

Ви можете думати про вершину як про крапку даних, яка складається з кута трикутника, який ви хочете намалювати на екрані (і ні частини «кута», ні частини «трикутника», «фарби» або «екрана» завжди вірні ). Позиція є однообов'язковою - аспект цього блоку даних, який ми називаємо Vertex.

Можна багато зробити, додавши до вершини додаткові дані. Найвідоміший приклад - ви можете додати uv координати, щоб намалювати текстуру на цьому трикутнику. Ви (як правило) не можете вирішити, яку частину текстури намалювати на трикутнику, якщо у вас є лише точка - потрібні і координати текстури.

Інші прикладні приклади того, що в цій краплі є нормальними, і дотичними. Важливо те, що всі вони необов’язкові, включаючи посаду. Vertex Color - це лише один із цих додаткових входів, який ви можете використовувати або зловживати, щоб створити гарне зображення на екрані.


2
".. як крапка даних, яка складає край трикутника", навіть це не обов'язково. Вершини можуть бути представлені як бали просто чудово.
Кромстер каже, що підтримує Моніку

3
Деякі чудові приклади ефектів шейдера, які ви можете досягти, використовуючи вершинні кольори, настійно рекомендую ознайомитись із розмовою про GDC Наталі Берк з минулорічного "Animating With Math" (відео на даний момент є лише учасниками, але слайди тут безкоштовні ) . Вона показує, скільки анімацій у передачах Destiny, волоссі та тканині персонажів і навіть частинах їхніх ворогів та оточення було досягнуто за допомогою вершинних шейдерів, сформованих та керованих вершинами кольорових каналів.
DMGregory

5
Я б заперечував, що це були не вершинні кольори, а атрибути вершин, показані як кольори для легшого сприйняття.
Кромстер каже, що підтримують Моніку

У цьому розмові про FortNite є кілька подібних винахідливих застосувань вершинних шейдерів , хоча, якщо я правильно згадую, я думаю, що вони здебільшого використовували УФ-канали вершин, а не кольорові канали.
DMGregory

3
Власне кажучи, з точки зору геометрії / математики вершина - це лише точка в просторі. 'Колір вершини' - це атрибут, застосований до вершини 'ідеєю' вершини, що використовується GPU. Це те саме, що коло, що має колір чи ні. Геометрична / математична «ідея» кола не має кольору, але програмне забезпечення «ідея» кола асоціює колір із колом. Таким чином, аргумент @ Кромстера є більш технічно правильним.
Фарап

8

Вершини можуть мати кольори, це властивість так само, як і звичайні.

У 3D-середовищі трикутник окрасується на основі кольорової інформації їх вершин. Найближчі фрагменти до вершини A отримують її колір, перемикач до вершини B отримує кольоровий колір B, а колір інтерполює між 2.

Це працює так само, як і вершинне освітлення

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


+1 за надання (сподіваємось) знайомого прикладу іншого подібного атрибута вершини
AC

Проблема кольорів вершин і нормалей полягає в тому, що вони вважають, що вершина є частиною сітки (наближення вигнутої поверхні). Якщо ви хочете гострих країв або різнокольорових граней (наприклад, на кубі), вам потрібні окремі вершини для кожного обличчя, що значно збільшує використання пам'яті (і уповільнює візуалізацію).
Я

@aml Ви можете використовувати плоский "оператор" в glsl для виведення, щоб затінення виглядало рівним. Це не так само, але це працює.
Bálint

інший інтерпольований атрибут: координата текстури та z-буфер! у нас є вершинний шейдер, який обчислює деякі дані для кожної з 3 вершин трикутника, вони інтерполюються під час малювання трикутника на екрані (або в якомусь буфері), а піксельний шейдер називається інтерпольованим значенням для кожного намальованого пікселя
user1952009

@aml Звичайно x2 не є вузьким місцем. І для цього я б сказав, що я б сказав (наприклад: перетворення текстури глибини в трикутники )
user1952009

2

Тут вже є ґрунтовні відповіді - я просто хочу зазвучити ще одним поширеним способом, коли ви побачите використовувані вершинні кольори:

Різні кольори об'єктів (або інші атрибути) в межах однієї партії / виклику.

Ви побачите це, що використовується у візуалізації систем частинок, тексту та пакетних (зазвичай атласованих) спрайтів.

Уявіть, що у вас є випромінювач частинок, який породжує частинки з випадковим кольором запуску або зникає до 0 альфа протягом життя частинок. Якби ми використовували шейдерні уніформи для надсилання цих кольорових даних, нам потрібно було б намалювати кожну частинку різного кольору за власним викликом, зробивши систему частинок значно дорожчою. Натомість, ми можемо вписати ці кольори у вершинні дані для частинок і зробити один пакет разом за один виклик.

Здається, Unity використовує цю техніку для зміни кольору частинок, а також для фарбування окремих символів у TextMesh або Sprites, поданих разом у пакеті.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.