Из моего опыта OpenGL кажется, что "нацеливание" на данную версию - это просто доступ к различным расширениям, которые были добавлены для этой версии. Таким образом, единственная причина, по которой вы «нацеливаетесь» на OpenGL версии 3, заключается в том, что вы хотите использовать некоторые из расширений, которые являются новыми для версии 3. Если вы действительно не используете расширения версии 3 (если вы просто делаете базовые вещи OpenGL) то, естественно, вы не «нацеливаетесь» на версию 3.
В Visual Studio вы всегда будете связывать свое приложение с opengl32.lib, и opengl32.lib не меняется в разных версиях OpenGL. Вместо этого OpenGL использует wglGetProcAddress () для динамического доступа к расширениям / версиям OpenGL во время выполнения, а не во время компиляции. А именно, если данный драйвер не поддерживает расширение, то wglGetProcAddress () вернет NULL во время выполнения, когда запрашивается процедура этого расширения. Таким образом, в вашем коде вам нужно будет реализовать логику, которая обрабатывает случай возврата NULL. В самом простом сценарии вы можете просто напечатать ошибку и сказать «эта функция недоступна, поэтому эта программа будет вести себя ...». Или вы можете найти другие альтернативные методы для того же, что не использует расширение. По большей части вы получите NULL-возврат от wglGetProcAddress только в том случае, если ваше приложение работает на старых аппаратных средствах / драйверах, которые не поддерживают версию OpenGL, в которой добавлено искомое расширение. Тем не менее, в последующие годы вы захотите быть в курсе тех вещей, которые новые версии OpenGL решили осудить. Я не слишком много читал в спецификации 3.1, но, видимо, они вводят модель устаревания, в которой устаревшие технологии / расширения могут быть устаревшими, что откроет дверь для новых аппаратных средств / драйверов, которые больше не будут поддерживать устаревшие расширения, и в этом случае wglGetProcAddress снова вернет NULL для этих расширений. Так что, если вы добавите логику для обработки возврата NULL в wglGetProcAddress (), все равно все будет в порядке даже для устаревших расширений. Возможно, вам просто потребуется внедрить лучшие альтернативы или установить новые расширения по умолчанию.
Что касается версионных заголовков API, то изменения в заголовках в основном являются просто изменениями, чтобы разрешить доступ к новым функциям, возвращаемым wglGetProcAddress (). Так что, если вы включите заголовок API для версии 2, вы можете продолжать, если вам нужны только расширения для OpenGL 2. Если вам нужен доступ к функциям / расширениям, которые были добавлены в версии 3, вы просто заменяете свою версию. Заголовок 2 с заголовком версии 3, который просто добавляет некоторые дополнительные указатели функций typedefs, связанные с новыми расширениями, так что при вызове wglGetProcAddress () вы можете привести возвращаемое значение к правому указателю функции. Пример:
PFNGLGENQUERIESARBPROC glGenQueriesARB = NULL;
...
glGenQueriesARB = (PFNGLGENQUERIESARBPROC)wglGetProcAddress("glGenQueriesARB");
В приведенном выше примере typedef для PFNGLGENQUERIESARBPROC определен в заголовках API. Полагаю, что glGenQueriesARB был добавлен в 1.2, поэтому мне понадобится как минимум 1.2 API-заголовка, чтобы получить определение PFNGLGENQUERIESARBPROC. Это действительно все заголовки.
Еще одна вещь, которую я хочу упомянуть о 3.1. Очевидно, что в версии 3.1 они устарели во многих функциях OpenGL, которые моя компания использовала довольно повсеместно, включая списки отображения, механизмы glBegin / glEnd и режим рендеринга GL_SELECT. Я не очень разбираюсь в деталях, но я не понимаю, как они могут это сделать, не создавая новый opengl32.lib для ссылки, потому что кажется, что большая часть этой функциональности встроена в opengl32.lib, и не доступен через wglGetProcAddress. Кроме того, собирается ли Microsoft включить этот новый opengl32.lib в свои версии Visual Studio? У меня нет ответа на эти вопросы, но я думаю, что, несмотря на то, что 3.1 устарела, эта функция будет существовать в течение длительного времени. Если вы продолжите связывание с вашим текущим opengl32.lib, он должен продолжать работать почти бесконечно, хотя в какой-то момент вы можете потерять аппаратное ускорение. Подавляющее большинство учебных пособий по OpenGL, доступных в Интернете, используют методы glBegin / glEnd для рисования примитивов. То же самое верно для GL_SELECT, хотя большая часть оборудования больше не ускоряет режим визуализации GL_SELECT. Даже в руководстве opengl.org используются предположительно устаревшие методы glBegin / glEnd. И я еще не нашел учебник по началу работы, который использует только функции 3.1, избегая устаревших функций (конечно, если кто-то знает одну, свяжите меня с ней). В любом случае, хотя кажется, что 3.1 выбрасывает много старого для всего нового, я думаю, что старое еще будет довольно долго.
Короче говоря, вот мой совет. Если ваши потребности OpenGL просты, просто используйте базовую функциональность OpenGL. Вершинные массивы поддерживаются в версиях 1.1 - 3.1, поэтому, если вы ищете максимальный срок службы и начинаете с нуля, это, вероятно, то, что вы должны использовать. Тем не менее, мое мнение - glBegin / glEnd, и списки отображения все еще будут присутствовать некоторое время, даже если они устарели в версии 3, поэтому, если вы хотите их использовать, я бы не стал слишком беспокоиться. Я бы избегал режима GL_SELECT для выбора в пользу альтернативного метода. Многие производители оборудования считали GL_SELECT устаревшим уже много лет, хотя он только устарел с версией 3. В нашем приложении мы сталкиваемся с множеством проблем, из-за которых он не работает на картах ATI и интегрированных картах GMA. Впоследствии мы только что реализовали метод выбора, используя запросы окклюзии, которые, кажется, решают проблему. Так что, чтобы сделать это правильно с первого раза, избегайте GL_SELECT.
Удачи.