Це не саме те, що OpenGL робив без шейдера геометрії?
Ні, це не так. GS - необов'язковий крок, а не крок, який має за замовчуванням.
Для того, щоб OpenGL виконав шейдер геометрії , він повинен виконати те, що відомо як " примітивна збірка ". Коли ви виведете ряд трикутників черезGL_TRIANGLE_STRIP
, OpenGL буде робити внутрішній матеріал для перетворення кожні 3 суміжні вершини в окремий трикутник, змінюючи порядок обмотки відповідним чином.
Зазвичай, коли не використовується GS, цей процес виконується один раз. Якщо ви використовуєте GS, він повинен бути виконаний перед виконанням GS. Але це також повинно бути виконано після GS, оскільки GS може виводити зовсім інший примітивний тип (наприклад, квадроцикли).
Тож тепер ви змушуєте систему робити безліч зайвих робіт ні за що. Зрештою, OpenGL не може припустити, що ваш GS нічого не робить (це нерозв'язна проблема).
Крім того, низка оптимізацій вже не функціонує за наявності GS. Розгляньте індексовану візуалізацію.
Кожен індекс з буфера масиву елементів буде отримувати однакові результати з вершинного шейдера. Таким чином, GPU часто кешує ці виходи в кеш-пам'яті після T & L . Якщо він бачить індекс, який вже знаходиться в кеші, VS не запускається знову; він просто отримує дані з кешу.
Що це"? "Це" - це ... примітивна збірна одиниця . Так, ця річ, яка запускається двічі, коли ви використовуєте GS. Індекс кешування матеріалів? Він працює лише для входів GS.
То що відбувається з виходами ГС? Ну, це залежить від обладнання. Але це має перейти в якийсь буфер пам'яті. І в цьому полягає проблема: цей буфер взагалі не індексується. Це як ситуація з glDrawArrays.
Отже, якщо ви надсилаєте індексний буфер 0, 1, 2, 0, 2, 3
, це перекладається на 4 вершини в кеш-пам'яті після T & L. Але буфер вершин пост-GS тепер має 6 вершин. Буфер пост-GS використовує більше місця. Отже, якщо ви зіткнулися з проблемою складання належних списків трикутників або смужок, оптимізованих після T & L, і переходите на GS проходу, як ваш, ви в основному загинули приблизно половину ваших результатів від цієї оптимізації.
Це було не марно, але це боляче.
До цього можна додати той факт, що у багатьох графічних процесорах GL 3.x класу (aka: DX10) були досить невеликі буфери після GS. Чим менше буфер, тим менше викликів GS ви можете мати активні одночасно. Тож ваші технічні засоби ефективно вузькі місця на GS. Оскільки tessellation є важливою особливістю обладнання 4.x класу, більшість таких апаратних засобів мають буфери, достатні для того, щоб зробити важче використання GS можливим.
Тож використання GS з більшою ймовірністю зробить обробку вершин коду вузьким місцем. Звичайно, ви завжди можете використовувати це на вашу користь, зробивши ваші вершини та фрагменти шейдери складнішими, оскільки це просто безкоштовне виконання в цей момент.
Для отримання додаткової інформації про сповільнення, спричинені GS, читайте цю статтю .
Ось основне правило щодо GS: ніколи не використовуйте GS, оскільки ви думаєте, що воно зробить візуалізацію швидше . Ви повинні використовувати його, коли це робить те, що ви намагаєтесь зробити . Якщо ви намагаєтеся зробити оптимізацію, використовуйте щось інше.
Загальні винятки з цього: