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

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 ++, но вы узнаете больше в долгосрочной перспективе.
Джонатан Дикинсон
3
Я хотел бы рекомендовать opengl-tutorial.org . Сайт довольно хорошо объясняет основы и использует только шейдеры.
Exilyth
3

Я бы сказал, чтобы начать с фиксированной функции на GLUT. Я не буду много говорить об этом, но идеи шейдеров довольно сложны и необходимые знания - это базовое трехмерное программирование (т.е. создание вершин, матрицы преобразования и т. Д.). Есть намного больше мест, которые вы можете испортить с помощью шейдеров, это намного больше, чтобы кодировать.

Проверьте мой учебник , и эти lighthouse3d те

bobobobo
источник
2

Я второй иду прямо к шейдерам. Это на самом деле не что намного сложнее настроить, и когда вы проходите , что первое препятствие вы имеете полное право на кончиках ваших пальцев.

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

MGB
источник
0

Я бы предложил использовать конвейер с фиксированными функциями в качестве основы вашей программы. Я считаю, что было бы легче, чтобы что-то появлялось, используя это вместо чисто шейдеров. Затем, когда вы узнаете, что не перепутали свои вершины или нормали, вы можете медленно, но верно продвинуться в мир затенения.

Oskar
источник