В QOpenGLFunctions отсутствуют важные функции OpenGL

В QOpenGLFunctions отсутствуют важные функции, такие как glInvalidateFramebuffer и glMapBuffer. Насколько я понимаю, QOpenGLFunctions загружает пересечение как настольных функций OpenGL, так и функций ES. Если это так, то почему нет этих двух функций? Насколько я могу судить, glMapBuffer есть в обоих.

Я неправильно понимаю QOpenGLFunctions, или у них действительно отсутствуют функции (маловероятно)?


person Ben    schedule 26.05.2014    source источник
comment
отсутствуют функции, glDrawArrays тоже нет   -  person ratchet freak    schedule 26.05.2014
comment
@ratchetfreak Знаете почему?   -  person Ben    schedule 26.05.2014
comment
@Ben Потому что glDrawArrays (...) - это функция OpenGL 1.1, и все платформы Qt реализованы на ее поддержке "из коробки". Причина отсутствия MapBuffer, вероятно, в том, что это необязательное расширение в OpenGL ES.   -  person Andon M. Coleman    schedule 26.05.2014


Ответы (2)


Есть несколько причин для этих двух случаев и одного в комментарии:

1) Насколько мне известно, процесс добавления был выборочным. Были добавлены только те функции, которые вам нужно разрешить вручную.

В вышеупомянутом случае glDrawArrays эта функция была доступна какое-то время как в десктопном OpenGL, так и в ES, где поддерживается Qt, так что нет особой необходимости решать что-либо вручную.

Вы можете сразу же использовать их обычным способом opengl, включая gl.h и все такое.

2) В настоящее время Qt не поддерживает OpenGL ES 3 через этот интерфейс. Ваши вышеупомянутые функции, glMapBuffer и glInvalidateFramebuffer, скорее всего, попадают в эту категорию. Они недоступны в OpenGL ES 2 «по умолчанию».

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

person lpapp    schedule 26.05.2014
comment
Вы имеете в виду включение gl.h? Однако эти функции недоступны в Windows. - person Ben; 26.05.2014
comment
Я все еще в замешательстве. Заголовки opengl, предоставляемые в некоторых системах, не включают функции, которые я упомянул в своем вопросе. Как вы их получаете? - person Ben; 26.05.2014
comment
Ах, я не знал, что они не были доступны в ES 2. Спасибо. - person Ben; 26.05.2014

QOpenGLFunctions просто предоставляет общее подмножество OpenGL 2 (+FBO) и OpenGL ES 2. Вот почему там нет ваших функций. glMapBuffer есть в OpenGL 2, но не в ES 2 (но есть расширение OES); glInvalidateFramebuffer есть в OpenGL 4.3.


Если вам нужны какие-либо другие функции, кроме функций общего подмножества, вы можете:

  • Начиная с Qt 5.6, используйте QOpenGLExtraFunctions, который нацелен на API OpenGL ES 3.0/3.1 (и примерно эквивалентную функциональность OpenGL для настольных ПК). Таким образом, у него есть как glMapBuffer, так и glInvalidateFramebuffer.

  • решите проблему самостоятельно через QOpenGLContext::getProcAddress

  • используйте QOpenGLContext::versionFunctions<T>(), чтобы получить объект функции, содержащий все функции для данной версии OpenGL, например

    auto functions = context->versionFunctions<QOpenGLFunctions_4_3_Core>();
    if (!functions) error();
    functions->initializeOpenGLFunctions();
    functions->glInvalidateFramebuffer(...);
    
  • #include <QOpenGLExtensions> и используйте класс(ы), обертывающие нужные вам расширения, например

    auto functions = new QOpenGLExtension_ARB_invalidate_subdata;
    if (!functions->initializeOpenGLFunctions()) error();
    functions->glInvalidateFramebuffer(...)
    
  • оберните комбинацию вышеперечисленного в класс, который будет использовать разрешенные вызовы с учетом подходящей версии GL, или вернуться к расширениям, или сбой (например, QOpenGLTexture).

Для glMapBuffer он на самом деле каким-то образом обёрнут QOpenGLBuffer.

person peppe    schedule 26.05.2014
comment
Великолепно! Я считаю, что OpenGL в Qt5 в лучшем случае сбивает с толку, это, безусловно, помогло мне. Но остается один большой вопрос: в моей существующей кодовой базе много кода opengl, который я сейчас пытаюсь внедрить в свое приложение Qt5. Есть ли способ использовать метод QOpenGLContext::versionFunctions‹T›() для получения правильного объекта функций без необходимости префикса каждого вызова opengl с functions-› ? - person Lennart Rolland; 22.09.2016
comment
Когда вы говорите правильные функции, вы имеете в виду конкретную версию GL? - person peppe; 22.09.2016