Я согласен с вышеупомянутыми книгами с несколькими примечаниями:
Восьмое руководство по программированию OpenGL уже вышло и было переделано для современного OpenGL 4.3.
SuperBible 5th ed предоставляет вам возможность запустить библиотеку костылей, но, просматривая книгу, вы переопределяете функциональность этой библиотеки, поэтому к концу ее вы должны быть полностью сведущими. Я также настоятельно рекомендую обернуть вещи OpenGL во что-то, если вы используете объектно-ориентированный язык. Я работаю над своей собственной библиотекой для забавы, которая, кажется, является подходящим способом, реализуя ее сам, я понимаю все входы и выходы, и мне нужно только вставить кусочки, которые я на самом деле использую. Кроме того, вы можете абстрагироваться от некоторых вещей, таких как отправка данных в шейдеры (не намного более блестящий), это также может позволить вам перенести некоторые вещи назад, предоставив устаревшие альтернативы. Существует также oglplus .
Основная проблема изучения современного «базового» OpenGL заключается в том, что для запуска и запуска базового конвейера, даже если он просто рисует куб, необходимо понимать следующее:
- Операции с матрицами (используйте GLM, если вы используете C ++, вам также понадобится версия неофициального SDK MatrixStack OpenGL или моя простая версия здесь ).
- Программирование шейдеров GLSL.
- привязка данных к шейдерам и объектам Vertex Buffer. Если вы хотите изучить просто настоящий профиль ядра, все они должны быть реализованы одновременно, а если что-то сломано, вы просто ничего не увидите и почти не поймете, где это пошло не так. Это также не распространяется на такие вещи, как базовое освещение (где вам нужно изучить алгоритмы затенения в дополнение к языку программирования).
Но вам не нужно начинать в углублении с профилем ядра. Вначале используйте некоторые устаревшие функции, они будут поддерживаться практически всем, а затем модернизировать их.
Другая проблема заключается в том, что «современный» OpenGL действительно может ссылаться на 3 вещи:
Первый - это программируемый шейдерный конвейер, а не конвейер с фиксированной функцией. Основные «современные» методы стали возможны с тех пор, как OpenGL 2.0 был выпущен в 2004 году, когда были введены шейдеры (учебники просто не обновлялись), а также 1.5 имели объекты буфера вершин, которые являются еще одним краеугольным камнем современного OpenGL. Проблема заключается в том, что даже сегодня разработчики OpenGL могут даже не воспользоваться всеми этими преимуществами, существует множество дурацких нетбуков с теми чипсетами Intel, которые поддерживают только OpenGL 1.5, и телефонами, такими как старые iPhone / Android, которые поддерживают только OpenGL ES 1.1. Единственная реальная разница между этими вещами в OpenGL 2.0 и OpenGL 3.x / 4.x заключается в том, что теперь это является обязательным для основного профиля.
Современный OpenGL также может ссылаться на новый материал в 3.x, 4.x. Такие вещи , как массив объекты Vertex , FrameBuffer объекты , единообразный Buffer Objects / std140 , отборочный макет , GLSL подпрограммамии так далее. Многие из тех, кого я нашел, могут намного лучше программировать. Они также могут тонко изменить ваши общие трубопроводы двигателя. Это также то, что с небольшими усилиями вы можете сделать бэкпорт с помощью вспомогательных функций и т. Д. (Например, напишите универсальный объект диспетчера шейдеров, который можно использовать для установки униформ, если UBO поддерживаются, используйте, в противном случае, управляйте выгрузкой значений в шейдеры вручную. , возможно, поместите туда немного шейдерного переписывающего материала для его автоматизации). Этот материал работает только на новых видеокартах, вы не увидите никаких нетбуков, поддерживающих его, или любых игровых консолей текущего поколения (они используют свое собственное подмножество OpenGL, аналогичное OpenGL ES). Последний OSX только 3.
Ультрасовременный nextgen OpenGL. OpenGL 4.3 был только что выпущен. Он поставляется с вычислительными шейдерами, glMultiDrawElementsIndirect и буферами хранения шейдеров. Это позволяет создать принципиально другой конвейер, в котором вы загружаете все данные вершин в графический процессор, а затем используете вычислительные шейдеры для вычисления того, что должно быть нарисовано, вместо того, чтобы делать это в вашей программе. К сожалению, это очень новое, поэтому я не знаю ни одного достойного учебника по нему. Взгляните на обзор OpenGL 4.3, в котором дается общее представление о том, как это работает (автор также говорит, что для его выпуска будет опубликована статья о GPU Pro). Будучи новеньким, он не будет нигде поддерживаться на данном этапе (если только вы не используете более новую карту nvidia с бета-драйверами). Хотя вы можете использовать OpenCL / CUDA для реализации некоторых из них.
Я бы пропустил glBegin, glEnd, glVertex *, glNormal *, glTextCoord *, glTranslate *, glRotate *, glLoadIdenity, glModelViewMatrix и так далее. Вместо этого начните с изучения объектов Vertex Buffer без шейдеров, не пытайтесь 3D на этом этапе просто в виде плоского белого треугольника, чтобы вам не приходилось работать с 3D-операциями с использованием матриц (поскольку вам нужно будет научиться связывать их с шейдерами в ближайшее время, поэтому нет смысла учиться по старинке). Затем добавьте в шейдеры, вам нужно изменить, как связаны ваши объекты буфера вершин, поскольку теперь вы захотите использовать атрибуты вершин. Узнайте, как сообщить им свойства через униформу. Затем изучите операции с матрицами с помощью GLM, свяжите матрицы с шейдерами и начните работу в 3D. Как только вы это сделаете, это в основном просто изучение более сложных вещей, таких как текстурирование,
Некоторые общие современные учебные пособия по OpenGL, охватывающие конвейер программирования шейдеров, большинство из которых работает с OpenGL 2.0+:
Для других общих учебных ресурсов. OpenGL ES может быть хорошей отправной точкой. OpenGL ES убрал все устаревшие вещи. OpenGL 4.1 полностью совместим с OpenGL ES, поэтому должна быть возможность взять программу OpenGL ES и запустить ее в OpenGL 4.1. И основные принципы одинаковы для обоих.
Следует отметить, что OpenGL ES 3.0 только что был выпущен, но, поскольку он новый, у него еще не будет учебников или аппаратной поддержки. Похоже, что в ней нет каких-либо серьезных фундаментальных изменений (например, разницы между фиксированной конвейерной моделью и моделью шейдеров, которую мы видели в OpenGL ES 1.0-> 2.0). Таким образом, вы, вероятно, не будете изучать какие-либо устаревшие вещи.
Кроме того, OpenGL ES часто будет использовать EGL, поэтому вам нужно будет изучить другой способ открытия окна, но это не должно быть слишком сложным. В противном случае есть несколько оболочек / эмуляторов OpenGL ES или вы можете узнать на Android / iPhone, если у вас есть (или посмотреть на использование их эмуляторов).
Существует Руководство по программированию Addison Wesley OpenGL ES 2.0, которое является эквивалентом Красной книги.
Вы также можете взглянуть на GLSL-шейдер-ориентированные вещи, потому что именно там живет большинство современных OpenGL. Вам просто нужно убедиться, что то, что вы изучаете, охватывает «связующую» сторону OpenGL.
Ознакомьтесь со вторым изданием OpenGL Shading Language (Оранжевая книга).
Кулинарная книга по языку затенения OpenGL 4.0 охватывает еще несколько новейших возможностей OpenGL, но сама по себе не является всеобъемлющим учебником. Определенно стоит взглянуть, чтобы получить представление о новейших практических методах OpenGL, таких как объекты единого буфера и подпрограммы GLSL.
Наконец, вы можете взглянуть на WebGL, хотя в JavaScript он будет несколько другим и намного сложнее в отладке.