Геометрія екземплярів у OpenGL ES 2.0


12

Я планую робити геометричну інстанцію в OpenGL ES 2.0. В основному я планую викласти ту саму геометрію (стілець), можливо, 1000 разів на моїй сцені.

Який найкращий спосіб зробити це у OpenGL ES 2.0?

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

Це склало б багато додаткових даних, що надсилаються до GPU (2 зайвих вершини * 16 плавців * (Кількість трикутників) кількість додаткових даних).

Або я повинен надсилати mat4 лише один раз на трикутник? Але як це можливо за допомогою атрибутів, оскільки атрибути визначаються як дані "за вершиною"?

Який найкращий та ефективний спосіб зробити екземпляр у OpenGL ES 2.0?


3
Я дуже сумую glVertexAttribDivisor:(
Буде

Відповіді:


9

ES2 не має ані glVertexAttribDivisor, ані текстур з плаваючою комою, тому ваші параметри досить обмежені.

Однозначно покладіть модель свого крісла на VBO, якщо ви цього ще не робите. Звідси ви більш-менш обмежені для індивідуальних розмовних дзвінків - по одному на стілець, - це питання максимально ефективно отримати матрицю перетворення кожного стільця до GPU.

Ви можете це зробити за допомогою звичайних дзвінків glUniform або ви можете зловживати деякими додатковими слотами вершин attrib і робити кілька викликів glVertexAttrib (зауважте: не glVertexAttribPointer) перед тим, як намалювати кожен стілець, вказавши матрицю за допомогою 4 таких слотів, і ці значення "пристануть" для кожна наступна вершина в кріслі. Це може бути досить швидким шляхом для деяких апаратних засобів, але повільніше для інших, тому вам доведеться експериментувати.

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

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


6

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


3

У Wolfire Games є відмінна публікація в блозі про швидку інстанцію об'єкта . Те, що вони роблять, - це відображати модель в кілька разів, але надсилати різну матрицю для кожного об'єкта в єдиний слот.

Це досить ефективний спосіб встановити цілу купу об’єктів, оскільки вам потрібно лише один раз надіслати дані (найбільше вузьке місце при наданні партії об'єктів завжди буде пропускною здатністю), а потім перетворити модель у шейдер.


+1 У будь-якому разі, я все ще не впевнений, що посилання на текст Nvidia також застосовна до мобільних PVR-мікросхем. Особливо про їх згадку про частину водія . http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/…
Eonil

1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

Це Google Talk на WebGL, що є OpenGL ES для JavaScript, тобто немає геометрії. Це може дати вам ідею, хоча це важко сказати, оскільки я не знаю, чи є ваше вузьке місце на графічному процесорі чи на процесорі.

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

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