Яке призначення індексів у 3D-рендерінгу?


11

Припустимо, ви створювали 3D-куб у OpenGL. Ви реалізуєте необхідні дані вершин для об'єкта (куба). Який би був сенс використання індексів?

v

 void CreateCube()
        {
            const Vertex VERTICES[8] =
            {
                { { -.5f, -.5f,  .5f, 1 }, { 0, 0, 1, 1 } },
                { { -.5f,  .5f,  .5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f,  .5f, 1 }, { 0, 1, 0, 1 } },
                { {  .5f, -.5f,  .5f, 1 }, { 1, 1, 0, 1 } },
                { { -.5f, -.5f, -.5f, 1 }, { 1, 1, 1, 1 } },
                { { -.5f,  .5f, -.5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f, -.5f, 1 }, { 1, 0, 1, 1 } },
                { {  .5f, -.5f, -.5f, 1 }, { 0, 0, 1, 1 } }
            };

            const GLuint INDICES[36] =
            {
                0,2,1,  0,3,2,
                4,3,0,  4,7,3,
                4,1,5,  4,0,1,
                3,6,2,  3,7,6,
                1,6,5,  1,2,6,
                7,5,6,  7,4,5
            };

    //....

    glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);

У наведеному вище прикладі створюється куб з необхідними вершинами у світовому просторі. Яке значення має показник?


1
У багатьох місцях ви побачите людей, які називають їх обличчями. І це вони є. Кожне обличчя, як правило, складається з 3 вершин, щоб утворити трикутник. Тому кожний 3 індексу відповідає одному трикутнику в кінцевій сітці. Їх називають індексами, оскільки вони в основному компенсують те, де фактична інформація про вершину знаходиться у вершинному масиві. Думаю, це все, що вам потрібно знати про індекси :)
Грімшо

Відповіді:


24

Індекси існують, щоб зменшити слід пам'яті, необхідний для представлення тривимірної моделі, так само, як кольорові палітри можна використовувати для зменшення розміру пам’яті 2D-зображення.

Індексація дозволяє уникнути повторення повного визначення вершини, якщо вам доведеться дублювати дані вершини, як це зазвичай потрібно робити для складної моделі.

Сучасні 3D-API відображають за допомогою трикутників; кожна грань куба потребує двох трикутників:

A--B 
|\ |   This cube face has two triangles:
| \|   ABD and ADC.
C--D

Щоб вказати це обличчя без індексів, потрібно вказати вершини A, B, D, A, D, C. Дві вершини ( Aі D) повторюються в вершинному буфері.

Тим НЕ менше, з індексами, ви можете мати вершинний буфер , який містить лише необхідні вершини ( A, B, Cі D) і шість показників: 0, 1, 3, 0, 3, 2. Оскільки показники, як правило, значно менші, ніж вершини, і багато вершин, як правило, повторюються в практичних моделях, це може бути значною економією місця.

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

Якщо справді всі ваші сітчасті вершини відрізняються на 100%, користі для індексів немає (адже ви витратили б більше місця на споживання резервного буфера індексів). Однак це не завжди відбувається.


1
Чи має бути натомість 0,1,3, 0,1,2?
Сумний розробник CRUD

0, 1, 3, 0, 3, 2, власне, дякую (на основі A = 0, B = 1, C = 2, D = 3). Я оновив відповідь.

можливо, варто згадати, що на сітці трикутника середня кількість трикутників, які примикають до вершини, становить 6.
Арне

7

Використання індексів виконує три основні цілі:

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

Перша з них очевидна, оскільки ви можете виміряти її безпосередньо у власному коді: якщо сітка мала, скажімо, 50k вершин, але якщо 30k з них були дублікатами, то ви зберігаєте пам'ять.

Друга і третя не такі очевидні - вам потрібно вже прийняти рішення про використання індексів, і вам потрібно профілювати свій код і виділити продуктивність "до" і "після", щоб отримати їх вимірювання.

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

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


0

Індекси кажуть, які групи з трьох вершин разом утворюють грані куба. Не кожна множина з трьох вершин трикутника є гранями трикутника.

Ви можете використовувати кожну вершину рівно один раз і просто багато разів повторювати ті, які використовуються у трикутнику, але це означатиме додаткові перетворення вершин. За допомогою індексів ви перетворюєте вершини лише один раз і використовуєте їх стільки разів, скільки вам потрібно.


Коли ви маєте на увазі трикутник ??
Сумний розробник CRUD

Сучасна графічна апаратура робить все як трикутники.

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