Чи є ще переваги використання gl_quads?


10

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

Тепер я чув, що через цю гру слід писати, використовуючи трикутники. Але мені цікаво, якщо через специфіку того, як OpenGL робить цей квадратик на два трикутники, коли-небудь вигідніше використовувати квадроцикли?

Зокрема, в даний час я рендерирую безліч непов’язаних квадратиків із досить великих буферних об'єктів. Однією з областей, над якими я повинен бути обережним, є те, наскільки великий вектор поплавків я використовую для створення / оновлення цих буферних об’єктів (у мене є досить багато додаткових знаків поплавця на вершину, і багато вершин у буфері - Найбільші буфери - близько 500 КБ).

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

Якщо gl_quads все ще працює, я отримую тут перевагу, або 50% додаткової пам’яті та процесорного часу все ще використовується для автоматичного перетворення OpenGL на два трикутники?


5
Я впевнений, що OpenGL підтримує якийсь індексований вершинний буфер, тобто ви зберігаєте лише однакові 4 вершини для квадратика, і замість того, щоб повторювати цілі вершини для створення двох трикутників, ви лише повторите індекси: [0,1,2] , [2,3,0]

Чудова відповідь тут
bobobobo

Я вважаю, що специфікація GL все ж визначає деякі випадки, коли малюнок як квадратик має значення, наприклад, з glPolygonMode (..., GL_LINE).
Максим Мінімус

Відповіді:


5

Перевірте свою фактичну гру. Якщо квадроцикли швидше, використовуйте ці. Якщо ні, не варто.

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

Словом, тест. Не припускайте і не вимагайте в Інтернету поради щодо ефективності. Ми можемо мати рацію іноді, але частіше ми або годуватимемо вас застарілими даними, даними, виходячи з конкретної обставини, у якій ви не знаходитесь, або відвертим сміттям, яке ми самі придбали в Інтернеті або від колег (які самі не можуть досвід роботи з перших рук).


3

Які альтернативи? Ну, одна з альтернатив - використовувати шейдери геометрії , передаючи GL_LINES_ADJACENCYпримітив (4 вершини) і змусивши GS перетворити цей примітив у трикутну смужку. Однак візуалізація відбуватиметься повільніше, оскільки слід вважати, що геометричні шейдери завжди повільніше відтворюють.

Кращий спосіб - використовувати індексовану візуалізацію. Тут у вас є дві альтернативи: GL_TRIANGLESі GL_TRIANGLE_STRIPз примітивним перезапуском. Останній призведе до дещо коротшого буфера індексів (по одному індексу на кожен квадратик). Ви можете повторно використовувати один і той же буфер індексів для будь-якого квадропередачі, тому вам не потрібно буде оновлювати чи змінювати буфер індексів.

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


Деякі недавні бенчмаркінг, які я робив, показують, що glMultiDrawArrays тепер є швидким шляхом як для NV, так і для AMD (не турбував Intel), тому є інший варіант - glMultiDrawArrays з вентилятором або смужкою.
Максим Мінімус

@ mh01: для цього потрібен масив команд малювання на стороні клієнта. Вам потрібно glMultiDrawArraysIndirectбуде це зробити на стороні GPU. Що ви можете зробити, але це обмежує обладнання.
Нікол Болас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.