Чи має значення я дізнаюся OpenGL чи Direct3D?


11

Чи є різниця між цими двома API незначними деталями реалізації, що означають, коли я навчився одного, я можу використовувати його для всього? Або є причини для вивчення однієї, а не іншої, якщо я хочу мати можливість використовувати її взагалі без необхідності повторного вивчення іншого API в майбутньому? Є те чи інше більш загальне?

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

Чи є різниця в тому, як портативний код буде на різних платформах (операційні системи / архітектури)? Мене цікавить наявність інших бібліотек, які працюють з ними, і те, чи одна чи інша призводить до менших обмежень ліцензування в її більш широкому середовищі. Будь-яке вимірювальне, що змінило б те, чи може бути одне з них, яке я навчусь, не обмежуючи мене.


2
відповідь щурячого виродка - хороша. Якщо ви хочете навчитися Direct3D, ви можете прочитати мою безкоштовну книгу "The Direct3D Graphics Pipeline" . Деталі API - це в основному Direct3D9, але концепції однакові. Вся справа в тому, що концепції програмування 3D-графіки насправді взагалі не змінилися з кінця 1960-х. API для вираження цих понять стали набагато розумнішими.
легалізувати

Відповіді:


9

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

Порівняйте це, навчаючись писати програми. Якщо ви дуже добре пишете програми, наприклад, на Java, у вас не буде стільки проблем з навчанням C ++, Objective-C, Swift або іншою об'єктно-орієнтованою мовою. Тому що це поняття та мислення, яких ви дізнаєтесь.

Вибір між OpenGL, Direct3D та Metal - це насамперед вибір, на яку операційну систему ви орієнтуєтесь. Direct3D в основному доступний в Windows, Metal на OS X і iOS, а OpenGL підтримується в більшості систем, включаючи OS X, iOS, Windows і Linux.

Графічна карта, мабуть, мало впливає на це рішення, оскільки я не знаю карти, яка підтримує лише одну чи дві. Якщо у вас немає виділеної відеокарти, швидше рендерінг буде проблемою. Хоча Intel HD Graphics та супутник AMD вже можуть зробити дуже багато.

Отже, вибирайте свою платформу.


Відмова: На сьогоднішній день я не використовував Direct3D і Metal.


2
> "Якщо ви дуже добре пишете програми, наприклад, на Java, у вас не буде стільки проблем з навчанням C ++" - це неправда. У всіх буде колосальна кількість проблем із навчанням та використанням C ++. Порівнювати його з Java або будь-якою іншою безпечною мовою абсолютно недоцільно. Для інших перерахованих вами мов (Objective-C, Swift чи інша мова, орієнтована на об'єкти), ця заява здебільшого вірна.
Відображати ім'я

9

Зараз ми переходимо до парадигм API.

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

Ось чому нові apis з'явилися (або незабаром незабаром) D3D12, вулкан і Metal є найбільш відомими. Ці API надають більше контролю над програмою і дозволяють їй заздалегідь оголосити, що вона хоче робити, використовуючи командні буфери. Вони також дозволяють вам керувати власними ресурсами (даними вершин, текстурами, ...) набагато безпосередньо. Використання їх з декількома набагато прямо вперед.

Вибір між старим і новим ґрунтується на тому, наскільки добре ви можете керувати виділеною відеопам'яттю та створювати буфер команд.

  • Якщо ви хочете чогось, що "просто працює" навіть на старшому обладнання, тоді старі шкільні API краще; вони також більш відомі, і ви отримаєте додаткову допомогу щодо них в Інтернеті.

  • З іншого боку, якщо ви можете впоратися з асинхронним характером диспетчерських команд і не заперечуйте, щоб відстежувати всі виділені буфери. Тоді нові API можуть бути для вас чимось.


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

3

Я особисто не думаю, що це має велике значення. Просто виберіть той, який відповідає вашому проекту. У минулому я використовував і D3D, і OpenGL. Саме поняття мають значення. Що б ви не схопили, вам потрібно зрозуміти (наприклад):

  • Що таке текстури та як їх використовує GPU.
  • Основні поняття розвитку графіки (вершини, примітиви, фрагменти тощо)
  • Як працює система камери (наприклад, матриці MVP у OpenGL).
  • Що таке шейдери та як правильно їх використовувати.
  • Наскільки відрізняється графічний процесор у порівнянні з процесором на вашій машині.
  • Які відмінності між моделлю пам'яті GPU та моделлю пам'яті процесора.
  • Що слід зробити на процесорі і що слід завантажити в GPU для обробки.

Як вже згадувалося тут, ми перебуваємо в середині переходу до нового набору API (Vulkan, Metal тощо), тому на даний момент, якщо ви абсолютно новачок у розробці графіки, ймовірно, зосередитись на GLSL - це гарна ідея, оскільки Vulkan також скористається цим.

Щодо портативності, D3D - це лише Windows (Ходять чутки, що проект Wine намагається змусити D3D працювати під Linux, але поки що нічого неможливого). OpenGL - кросплатформна. Якщо ви хочете перейти на мобільний, то OpenGL ES - це доступний варіант. Звичайно, і OpenGL, і OpenGL ES мають різні версії, які підтримуються не всіма платформами.

Зрештою, всі API-адреси мають доступ до одного обладнання на вашій машині, питання лише в тому, як вони отримують доступ до нього.


Direct3D - це також те, що ви б використовували, якщо програмуєте будь-яку з консолей Xbox.
легалізувати

Що ви маєте на увазі під "нічого нездійсненного"? Вино без проблем запускає сотні програм, заснованих на D3D, і робило це роками. Звичайно, є помилки та незавершені частини, але це не робить весь API непридатним.
Руслан

0

Скажу кілька слів про візуалізацію без графічних карт.

Нієтер OpenGL, ні DirectX дійсно не потребують відеокарти. Реалізація може бути повністю прискорена.

Для OpenGL в Linux існує програмний растерізер Mesa. На мій досвід, це працює нормально, доки ви не натискаєте на нього занадто сильно, поєднуючи дивні функції (список відображення + індексовані вершинні масиви). Я думаю, що їх перелік дійсних помилок на милі високий. Обов’язково робіть безперервне тестування!

У мене менше досвіду використання OpenGL в Windows. Відредагуйте відповідь, якщо ви щось знаєте!

DirectX SDK поставляється з програмним растризатором, який називається "еталонний растерізатор". Це, головним чином, для налагодження, на мою думку, але я знаю щонайменше одного друга, який використовує опорний растризатор, коли розробляє DX11 на ноутбуці, здатному підтримувати DX10. Як зазначено в інших відповідях, DirectX - це лише Microsoft.


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