Я пытаюсь перенести предыдущий проект на новые классы Qt5 OpenGL. Я хочу сделать текстуру, используя FBO. В предыдущем коде использовалось несколько текстур, которые я прикреплял к FBO по требованию. Итак, я бы прикрепил определенный объект текстуры, выполнил рендеринг, прикрепил другую текстуру и выполнил другую операцию, чтобы вывод был обработан для вновь прикрепленной текстуры, и так далее.
Мне было интересно, как бы я поступил так, используя классы Qt5 OpenGL. Например, я не могу понять, как прикрепить определенный QOpenGLTexture
возражать против QOpenGLFrameBufferObject
так что я могу сделать это. Я вижу, что есть texture()
метод и takeTexture()
метод. Но они оба просто возвращают идентификатор текстуры. Кроме того, как я могу изменить активный текстурный блок? Например, я хочу сэмплировать две текстуры в моей шейдерной программе. Итак, мне нужно привязать две текстуры к разным текстурным блокам.
Чтобы уточнить, главная проблема, с которой я сталкиваюсь с новым API, заключается в том, что я не вижу никакого метода в QOpenGLFrameBufferObject
что бы вернуть QOpenGLTexture
объект. Есть только toImage()
метод и texture()
а также takeTexture()
методы. Я думаю, я мог бы просто построить QOpenGLTexture
с использованием QImage
вернулся из toImage()
, Но я не уверен, будет ли это эффективно.
Что касается texture()
а также takeTexture()
Я не вижу, как их возвращаемые значения могут быть использованы с использованием новых классов.
Да, QOpenGLFrameBufferObject предшествует QOpenGLTexture и, как таковой, не использует и не предоставляет QOpenGLTexture. Он должен быть добавлен, но на самом деле QOpenGLFBO должен быть просто переписан для поддержки нескольких вложений.
Кроме того, в чем проблема при использовании вызовов GL вручную?
GLuint textureId = fbo->texture();
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_2D, textureId);
glActiveTexture(GL_TEXTURE9);
glBindTexture(GL_TEXTURE_3D, anotherTexture);
QOpenGLTexture *yetAnother = getTexture();
yetAnother->bind(2);
program->setUniformValue("samplerForTheFBOTexture", GL_TEXTURE4 - GL_TEXTURE0);
program->setUniformValue("my3dSampler", GL_TEXTURE9 - GL_TEXTURE0);
program->setUniformValue("anotherSampler", 2);
// or use layout (binding = ) in GLSL
и т.п.
Я добавил запрос функции в багтрекер Qt для поддержки нескольких целей рендеринга (MRT) для QOpenGLFramebufferObject. В настоящее время он находится в процессе разработки и кажется, что ожидается только проверка кода.
https://bugreports.qt.io/browse/QTBUG-39235
Так что следите за журналами изменений будущих версий Qt.