Фіксована функція проти шейдерів: що для новачків?


16

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

Після того як я прийняв це рішення вивчити OpenGL, я провів ще кілька досліджень і дізнався про дихотомію, про яку я якось не знав увесь цей час: OpenGL з фіксованою функцією та сучасним програмованим шейдером на основі OpenGL. Спочатку я подумав, що це очевидний вибір, який я повинен вибрати для вивчення шаблону OpenGL на основі шейдерів, оскільки саме це найчастіше використовується в галузі сьогодні. Однак я натрапив на дуже популярне сучасне 3D графічне програмування Джейсона Л. Маккесона, яке знаходиться тут: http://www.arcsynthesis.org/gltut/

Я читаю вступні біти, і в розділі "Про цю книгу" автор констатує:

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

але в той же час також випливає, що фіксований функціонал забезпечує більш легку та безпосередню криву навчання для початківців, заявляючи:

"Зазвичай вважається найпростішим навчати графіків-неофітів, використовуючи конвеєр фіксованих функцій."

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

TL; DR = Як бажаючий програміст ігрової графіки, чи моє найбільше інтересів вивчати 3D програмування за допомогою фіксованого функціоналу чи сучасного шейдерного програмування?


До цього також є деякі подібні запитання ...
notlesh

"Але в той же час також випливає, що фіксований функціонал забезпечує більш легкий та безпосередній кривий спосіб навчання для початківців, заявляючи:" Мені цікаво. Як саме це робить цей випадок? Тому що цитата чітко говорить: " Взагалі вважається найпростішим ..." (наголос додано). Як і в, це може вважатися правдою, але це не означає, що це правда.
Ніколь Болас

Так, це був незручний спосіб формулювання цього.
Роб Хейс

Трубопровід з фіксованою функцією застарів і в OpenGL, і в DirectX, тому я не витрачав би на це ваш час. Базові шейдери досить прості, і, звичайно, не складніші, ніж достатнє розуміння, щоб працювати контексту візуалізації.
3Dave

Відповіді:


30

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

Просто здається, що було б простіше і менш заплутано використовувати шейдери весь час. Шейдери потребують трохи більшої роботи з налаштування, оскільки у вас є окремий вихідний файл, який потрібно завантажити та компілювати, кілька додаткових викликів C, щоб шукати та встановлювати параметри тощо. кодувати кілька різних ефектів, випробовувати різні ідеї тощо. І вам не потрібно дбати про те, де знаходяться межі системи з фіксованою функцією і чи може вона чи не може робити те, що ви хочете; шейдери можуть робити все, для чого можна написати код, модулюючи звичайні межі продуктивності та пам'яті.


Класно, дякую за відповідь. Я, швидше за все, в кінцевому підсумку просто піду за шейдерами.
Роб Хейс

3
+1 - це також щось на кшталт "Навчання C ++" та "Навчання ОСНОВОМ". Навчання C ++ займе більше часу, але ви дізнаєтесь більше з часом.
Джонатан Дікінсон

3
Я хотів би порекомендувати opengl-tutorial.org . Сайт пояснює основи досить непогано і використовує лише шейдери.
Exilyth

3

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

Перевірте мій підручник , і ці lighthouse3d ті


2

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

Більш того, ви побачите, що шейдерне програмування більше відповідає математичним рівнянням, які ви бачите в книгах та графічних лекціях в коледжі.


0

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

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