Скільки програм OpenGL потрібно використовувати для візуалізації декількох об'єктів?


10

У моїй сцені є кілька об’єктів. (Скажімо, 3 кубики, 1 циліндр, 8 сфер.) Я припускаю, що я повинен створити вершинний шейдер для кожного. Скільки програм я маю мати?

Альтернативи:

  • Одна програма на об’єкт
  • Одна програма для всіх кубів та інша для всіх сфер (якщо використовувати однакові шейдери)
  • Одна велика програма на все

Який правильний підхід?


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

Відповіді:


8

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

Так само, як і комбінування текстур, комбінування шейдерів поставляється із накладними витратами - якщо ви виводите лише 16x16 пікселів із текстури 4096x4096, ви не використовуєте апаратне обладнання ефективно. Аналогічно, якщо об’єкт, який ви надаєте, використовує лише 10% коду у вашому шейдері, можливо (і навіть певно), що відеокарта обробляє безліч речей.

Коротше кажучи, "залежить".


4
Крім того, у багатьох випадках можна втекти лише одним шейдером. Відмінності полягають лише у мундирах, які ви переходите до шейдера, наприклад, колір, фактура, звичайні карти тощо
rioki

Так, наприклад, у вас може бути шейдер "Scaly", який створює фрагменти, які виглядають лускатими, і який працює таким чином (більшість шейдерів це робить ...), що ви можете виводити всі 3 кубики, 1 циліндр і 8 сфер за допомогою цього один шейдер (звичайно, з відповідними примітивними елементами геометрії). Розумний набір уніформи тут може бути значенням вектора, що визначає колір, а може бути декілька скалярів чи щось, що впливає на те, наскільки "лускатим" чи "блискучим" буде візуальний ефект. Потім у вас є один шейдер, і ви змінюєте, як шейдер розфарбовує фрагменти, змінюючи форми між малюнками окремих геометрій.
Стівен Лу

5

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

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

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

Метою такої системи є простота. Просто. Тримайте. Це. Простий.


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