Должен ли я включать SDL_opengl.h после GL/glew.h?
Я хотел бы создать проект OpenGL с SDL2. Я обычно начинаю свои проекты OpenGL, включая GL/glew.h
первый. Должен ли я включать SDL_opengl.h
после этого? Он также содержит заголовки OpenGL API, поэтому мне кажется, что нет необходимости включать оба.
0 ответов
SDL
можно указать для рендеринга с использованием OpenGL. Но вы можете использоватьSDL
для других вещей и делать вещи OpenGL самостоятельно.
Во втором случае вам нужен способ определения и загрузки указателей функций API GL из драйвера. GLEW
есть такой загрузчик функций.
В первом случае, используя рендеринг SDL, SDL
будет # включать все заголовки OGL, необходимые для #include SDL_opengl.h
. Например, он включен из SDL_render_gl.c
Получение указателей функций OGL дважды, включая оба glew.h
а также SDL_opengl.h
это не выход. Если вы включитеSDL_opengl.h
перед glew.h
вероятно, вы получите ошибку утверждения компилятора.
Если вы сначала включитеglew.h
возможно, компилятор позволяет это, я не тестировал его, и, похоже, ничто в заголовках SDL не проверяет этот случай.
Но на самом деле вы ничего не получаете, используя GLEW
с участием SDL
(*) и это может привести к сбою.
(*) Это правда, что вам может понадобиться некоторая "новая" функция, которая содержится в последней версии glew, но не в SDL. В этом случае избегайте всех функций рисования OGL, предоставляемых SDL.
РЕДАКТИРОВАТЬ
Комментарий @HolyBlackCat о том, что SDL поддерживает только GL 1.x, не совсем верен. Но это требует дополнительных пояснений.
SDL предоставляет собственный API. Чтобы нарисовать линию, вы вызываете https://wiki.libsdl.org/SDL_RenderDrawLine, который внутренне и в зависимости от используемого средства визуализации вызывает команду gl или другую команду для другого API (ОС, DirectX и т. Д.). Отgl-command
Я имею в виду команду, определенную в спецификациях OpenGL (glDrawArrays, glBindVertexBuffer и т. Д.).
Все gl-something не только должны быть определены, но для OGL>1.1 функции gl также должны быть загружены из драйвера. SDL загружает используемые gl-функции, по общему признанию, большую часть GL1.1 и несколько GL2.1.
Я нашел этот пример SDL+OGL3, который, похоже, работает без внешнего загрузчика (например, glew), только SDL. Я не тестировал его, но я не могу найти в источнике SDL, где загружены некоторые функции OGL, используемые в этом примере.
То, что я делаю, можно увидеть в SDL_opengl_glext.h (входит вSDL_opengl.h
) является почти копией заголовков, предоставленных Khronos, которые действительно определяют прототипы последней версии (4.4?). Эти заголовки также являются частьюglew
файлы; glew обновляет их как можно скорее.
И тогда мы переходим к этому вопросу:
- Собираюсь ли я использовать только SDL API? Если да, то GLEW не требуется.
- Собираюсь ли я использовать OGL 1.x самостоятельно, но также буду использовать рендеринг SDL GL? Если да, то опять же, GLEW не нужен.
- Я хочу сделать OGL>=2 самостоятельно. Если вы используете функции, уже загруженные SDL (удачи в их обнаружении), то GLEW не требуется.
- Я хочу полностью использовать все функции OGL. Тогда не используйте SDL для рендеринга в окнах, в которых выполняется рендеринг GL. Но используйте SDL для создания окна и контекста.
Я в случае 4. Какие заголовки включить?
Прежде всего, помните, что вам нужен "загрузчик gl-функций". Поскольку SDL загружает не все функции OGL (а только их несколько), вам понадобится другой загрузчик, например GLEW.
Затем, если вы все равно собираетесь использовать GLEW, просто включите glew.h
вместо того SDL_opengl.h
. Использование того и другого не приносит пользы, и вы можете столкнуться с ошибкой.