2013-02-16 3 views
0

Я работаю над простым приложением OpenGL с использованием Qt5, и я использовал новые классы QOpenGL для обработки буферов вершин, буферов индексов и шейдеров. Тем не менее, я немного застрял на текстурах.Как загрузить и привязать текстуру к классам OpenGL Qt?

У меня есть QOpenGLBuffer и QOpenGLShaderProgram ... но где QOpenGLTexture? В Qt5 class list такой класс не существует. Нужно ли мне прибегать к прямым вызовам OpenGL для управления текстурами?

+0

После представления моего ответа я понял, что заголовок и содержание вашего вопроса несколько противоречивы: модуль [Qt OpenGL] (http://doc-snapshot.qt-project.org/qt5-stable/qtopengl/ qtopengl-index.html) содержит «старый» интерфейс на основе QWidget для OpenGL, включая функциональность 'QGLWidget :: bindTexture (...)'. Новые классы Qt5 _QOpenGL * _ являются частью нового модуля [Qt Gui] (http://doc-snapshot.qt-project.org/qt5-stable/qtgui/qtgui-index.html). Я новичок в этом: можно ли обновить заголовок вопроса для разъяснения? – axxel

+0

Я удалил слово «модуль» из названия. Я был бы в порядке с ответами, указывающими мне на что-нибудь в Qt Gui или Qt OpenGL (несмотря на то, что QtOpenGL в основном не рекомендуется). – cgmb

+0

@axxel Интересно, что вы упоминаете 'QGLWidget :: bindTexture (...)', так как это было бы довольно разумное решение, если бы я был подклассифицирован QGLWidget. К сожалению, поскольку я оказываю поддержку QQuickView, было бы довольно сложно использовать это. – cgmb

ответ

3

Это верно: такой класс не существует в модуле QtGui Qt5. И да, вы должны прибегать к простым вызовам OpenGL для обработки ваших текстур, если вы не хотите втягивать библиотеку виджета.

Это говорит о том, что текущая (скажем, несколько неоптимальная и непоследовательная) ситуация признана и активно обсуждается разработчиками Qt. См. Сообщение Sean Harmer's OpenGL in Qt 5.1 and onwards, в частности пункт 7. Но после этого потока и взгляда на текущее дерево древо, я сомневаюсь, что он приземлится в 5.1.


Редактировать: Глядя на других ответы и последние замечания, которые я хотел бы добавить относительно вариантов у вас есть со стандартным Qt 5.0:

Вашей главной целью:

  1. прибудет какой-то указатель вы можете перейти на glTexImage2D(..., GL_UNSIGNED_BYTE, GL_RGBA, pointer) из вашего потенциально «странного» отформатированного QImage? или
  2. использовать какой-либо вспомогательный класс, который вас интересует с помощью glTex*() связанных функций?

Если это первый и связанный (старый) модуль OpenGL (который является частью Qt 5.0) является вариантом (и, кроме «эстетически» причин, я не понимаю, почему это не будет) , вы могли бы использовать статический QGLWidget::convertToGLFormat(QImage), на который намекал Виктор. Если нет, то выполнение чего-то вроде этой функции «вручную» (в соответствии с тем, что предложил Xīcò) должно работать: сначала сначала вызываем QImage::convertToFormat(QImage::Format_ARGB32), а затем добавляем зависящую от платформы байтов и зеркалирование байтов (см. convertToGLFormatHelper (...) в the source). Хотя, если вы используете свои собственные шейдеры, то делать это на графическом процессоре намного быстрее.

Если вы хотите иметь как и связывая упомянутые OpenGL Qt 5.0 дополнительный модуль вариант, вы можете быть в состоянии фактически использовать QGLWidget::bindTexture(...) эквивалент даже в классе QQuickView:

GLuint texID = QGLContext::fromOpenGLContext(
        this->openglContext())->bindTexture(...) 

Где this будет QQuickView *. См. QGLContext help. (Отказ от ответственности: я не пробовал это сам.)

+0

Я действительно прибегал к простым вызовам OpenGL. Это был не первый ответ, который сказал мне об этом, но он был наиболее хорошо написан. Принято. – cgmb

1

QImage имеет прямую поддержку формата, совместимого с OpenGL, который может быть предоставлен в функции glTexImage ..().

См. Главу 6 примечания here.

Так что да, прямые вызовы OpenGL могут/должны использоваться.

+0

Ick. Чтобы преобразовать QImages в формат OpenGL в моем приложении без виджета, я должен включить QGLWidget? И это функция, которая заявляет, что возвращает QImage, который не может использоваться как QImage? И, кроме того, мне нужно смешивать оболочки OpenGL Qt с необработанными вызовами, чтобы показать основной текстурированный куб? Наверное, это еще первые дни для Qt5. – cgmb

+0

Было бы большой дискуссией о необходимости обернуть каждую функцию OGL в Qt. Qt создает контекст GL, но тогда это не 3D-движок. Поэтому некоторые вызовы низкого уровня кажутся мне подходящими. –

1

Ick. Чтобы преобразовать QImages в формат OpenGL в моем приложении без виджета, я должен включить QGLWidget?

В зависимости от вашей машины байтов и формат OpenGL вы хотите, вы можете использовать формулировку, как:

QImage gl_compatible_image = standard_image.rgbSwapped().mirrored();

, например, для отображения Format_RGB32 QImage в GL_RGBA текстуры на Intel машина.

+0

Что вы подразумеваете под Ick. ? –

+0

@MehdiKaramosly 'Ick' - это восклицание, используемое для выражения отвращения. – cgmb

+0

Также спасибо Xīcò. На самом деле это довольно приятно знать. – cgmb

1

Похоже, что класс, который я ищу, это QGLTexture2D, который является частью Qt3D. К сожалению, как упоминает axxel, он не является частью Qt 5.0 и не может попасть в Qt 5.1.

Это, я мог бы retrieve and build Qt3D себя. Тогда я мог бы использовать QGLTexture2D так же, как QOpenGLBuffer и QOpenGLShaderProgram У меня уже есть.