Мультитекстурирование с использованием QOpenGLTexture и QOpenGLFrameBufferObject
Вопрос
Я пытаюсь перенести предыдущий проект на новые классы 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.