В настоящее время я иду в колледж для информатики. Хотя в какой-то момент я планирую использовать существующий движок для создания маленькой игры, сейчас моя цель - изучить основы: а именно, 3D-программирование. Я уже провел некоторое исследование относительно выбора между DirectX и OpenGL, и общее мнение, которое из этого получилось, заключалось в том, что независимо от того, выберете ли вы OpenGL или DirectX в качестве платформы для учебных колес, многие знания можно перенести на другую платформу. , Поэтому, поскольку OpenGL поддерживается большим количеством систем (возможно, глупая причина выбирать, что изучать), я решил, что сначала я собираюсь изучать OpenGL.
После того как я принял решение изучать OpenGL, я провел еще несколько исследований и обнаружил дихотомию, о которой я все это время как-то не подозревал: фиксированная функция OpenGL или современный программируемый шейдерный OpenGL. Сначала я подумал, что это был очевидный выбор - изучать шейдерный OpenGL, поскольку это то, что наиболее часто используется в отрасли сегодня. Тем не менее, я наткнулся на очень популярное программирование по обучению современной 3D-графике Джейсона МакКессона, расположенное здесь: http://www.arcsynthesis.org/gltut/
Я прочитал вступительные фрагменты и в разделе «Об этой книге» автор заявляет:
«Во-первых, многое из того, что изучено с помощью этого подхода, должно быть неизбежно отброшено, когда пользователь сталкивается с графической проблемой, которую необходимо решить с помощью программируемости. Программируемость уничтожает почти весь конвейер фиксированных функций, поэтому знания не могут легко передаваться».
но в то же время также подчеркивается, что фиксированная функциональность обеспечивает более легкую, более непосредственную кривую обучения для начинающих, заявляя:
«Обычно считается, что проще всего обучать программистов-новичков с использованием конвейера с фиксированными функциями».
Естественно, вы можете понять, почему у меня может возникнуть конфликт по поводу того, какую парадигму изучать: я трачу много времени на изучение (а затем и на повторное обучение) способов фиксированной функциональности или я предпочитаю начинать с шейдеров? Моя главная проблема в том, что современные программируемые шейдеры так или иначе требуют от программиста понимания конвейера с фиксированными функциями, но я сомневаюсь, что это так.
TL; DR = Как начинающий программист игровой графики, в моих ли интересах изучать 3D-программирование с помощью фиксированной функциональности или современного шейдерного программирования?
источник
Ответы:
Я не покупаю аргумент, что легче начать с вещей с фиксированной функцией. Это может быть случай, когда с помощью фиксированной функции вы можете делать определенные вещи с меньшим количеством кода - например, в OpenGL с фиксированной функцией вы можете получить очень простое освещение / затенение, выполнив
glEnable(GL_LIGHTING)
несколько других вызовов. Проблема в том, что как только вы захотите что-то немного другое - например, освещение на пиксель, а не освещение на каждую вершину, - вам придется полностью отказаться от фиксированной функции и написать шейдер для реализации обеих фиксированных функций, которые вы использовали. до того плюс все, что вы хотели изменить.Просто кажется, что было бы проще и менее запутанно использовать шейдеры все время. Шейдерам нужно немного больше работы по настройке, так как у вас есть отдельный исходный файл, который необходимо загрузить и скомпилировать, некоторые дополнительные вызовы C для поиска и установки параметров и т. Д. Но как только вы запустите шейдер, это станет самым простым кодировать несколько разных эффектов, пробовать разные идеи и т. д. И вам не нужно заботиться о том, где находятся ограничения системы с фиксированными функциями и может ли она делать то, что вы хотите, или не можете; шейдеры могут делать все, что вы можете написать код, по модулю обычные ограничения производительности и памяти.
источник
Я бы сказал, чтобы начать с фиксированной функции на GLUT. Я не буду много говорить об этом, но идеи шейдеров довольно сложны и необходимые знания - это базовое трехмерное программирование (т.е. создание вершин, матрицы преобразования и т. Д.). Есть намного больше мест, которые вы можете испортить с помощью шейдеров, это намного больше, чтобы кодировать.
Проверьте мой учебник , и эти lighthouse3d те
источник
Я второй иду прямо к шейдерам. Это на самом деле не что намного сложнее настроить, и когда вы проходите , что первое препятствие вы имеете полное право на кончиках ваших пальцев.
Более того, вы обнаружите, что шейдерное программирование более точно соответствует математическим уравнениям, которые вы видите в книгах и графических лекциях в колледже.
источник
Я бы предложил использовать конвейер с фиксированными функциями в качестве основы вашей программы. Я считаю, что было бы легче, чтобы что-то появлялось, используя это вместо чисто шейдеров. Затем, когда вы узнаете, что не перепутали свои вершины или нормали, вы можете медленно, но верно продвинуться в мир затенения.
источник