Давайте уявимо велику сітку з сітки, як та, яку ми могли б використовувати для місцевості. Ми будемо робити n
трикутники варті цього, покриваючи, скажімо, половину нашого екрану 1080p, за один дзвінок на розіграші.
Якщо ми зварюємо всі наші вершини і не маємо швів згладжування / текстурування, то кожен трикутник має 3 вершини і кожна вершина ділиться на 6 трикутників, тому у нас є n/2
вершини.
Щоб це зробити, нам потрібно:
Запустіть вершинний шейдер принаймні кілька n/2
разів
("принаймні", тому що наш кеш для вершинних результатів лише такий великий. Іноді ми закінчимо виселення вершини, яку ми вже трансформували, потім знову знадобимо її для пізнішого трикутника, який поділяє її, і так повторно запустимо вершинний шейдер на ньому . Таким чином, ми не отримуємо стільки економії, як це виглядає на папері)
n
Трикутники із затискачами та клітинами .
Розстройте та інтерполюйте щонайменше 1920x1080 / 2 або близько 1 млн пікселів буфера кадру (оскільки ми говорили, що наша місцевість охоплює приблизно половину екрану).
("принаймні" через те, як графічні процесори працюють на квадратиках пікселів , деякі фрагменти, що знаходяться за межами країв багатокутників, все ще растеризуються, але потім маскуються. Це означає, що ми обробляємо фрагменти двічі. Для об'ємної сітки ми також будемо перевершувати будь-яку мережу Виключає себе, якщо нам не пощастить спочатку намалювати передній багатокутник у буфер глибини)
Запустіть шейдер фрагмента для всіх> = 1 мільйон фрагментів.
Змішайте ~ 1 мільйон результатів в буфери кадрів і глибин.
Гаразд, тепер давайте розгорнемо всі наші вершини, тому тепер у нас є 3n
вершини для рендерингу, у шість разів більше, ніж раніше! Наші кроки ...
Запустіть вершину шейдера 3n
раз.
(Жодних зірочок через кешування немає, оскільки кожна вершина використовується лише один раз, хоча це означає, що кеш не може врятувати нас ніколи)
n
Трикутники із затискачами та клітинами .
Розпаковуйте та інтерполюйте щонайменше 1920x1080 / 2 або близько 1 млн пікселів буфера кадру.
Запустіть шейдер фрагмента для всіх> = 1 мільйон фрагментів.
Змішайте ~ 1 мільйон результатів в буфери кадрів і глибин.
... зачекайте, кожен крок, крім першого, той самий! Тож більшість робіт, які GPU виконує в типовому дзвінку, безпосередньо не пов'язані з кількістю використаних вершин. Обсяг покриття екрана, перевитрата та загальна кількість трикутників становлять набагато більше витрат.
Це не означає, що вершини є абсолютно вільними. Якщо ви ділитеся вершинами, коли ви можете отримати невелику економію від кешування, особливо якщо вершинні шейдери складні або вершина трубопроводу вашої апаратури слабка (як це було у випадку з старими консолями). Але з огляду на те, що кількість вершин відстежує пропорційно чисельності трикутника плюс або мінус постійному коефіцієнту, зазвичай це не так цікаво показник загальної вартості сітки.