Мульти-текстурирование с использованием QOpenGLTexture и QOpenGLFrameBufferObject

Я пытаюсь перенести предыдущий проект на новые классы Qt5 OpenGL. Я хочу сделать текстуру, используя FBO. В предыдущем коде использовалось несколько текстур, которые я прикреплял к FBO по требованию. Итак, я бы прикрепил определенный объект текстуры, выполнил рендеринг, прикрепил другую текстуру и выполнил другую операцию, чтобы вывод был обработан для вновь прикрепленной текстуры, и так далее.

Мне было интересно, как бы я поступил так, используя классы Qt5 OpenGL. Например, я не могу понять, как прикрепить определенный QOpenGLTexture возражать против QOpenGLFrameBufferObject так что я могу сделать это. Я вижу, что есть texture() метод и takeTexture() метод. Но они оба просто возвращают идентификатор текстуры. Кроме того, как я могу изменить активный текстурный блок? Например, я хочу сэмплировать две текстуры в моей шейдерной программе. Итак, мне нужно привязать две текстуры к разным текстурным блокам.

Чтобы уточнить, главная проблема, с которой я сталкиваюсь с новым API, заключается в том, что я не вижу никакого метода в QOpenGLFrameBufferObject что бы вернуть QOpenGLTexture объект. Есть только toImage() метод и texture() а также takeTexture() методы. Я думаю, я мог бы просто построить QOpenGLTexture с использованием QImage вернулся из toImage(), Но я не уверен, будет ли это эффективно.

Что касается texture() а также takeTexture()Я не вижу, как их возвращаемые значения могут быть использованы с использованием новых классов.

2

Решение

Да, 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

и т.п.

5

Другие решения

Я добавил запрос функции в багтрекер Qt для поддержки нескольких целей рендеринга (MRT) для QOpenGLFramebufferObject. В настоящее время он находится в процессе разработки и кажется, что ожидается только проверка кода.

https://bugreports.qt.io/browse/QTBUG-39235

Так что следите за журналами изменений будущих версий Qt.

0

По вопросам рекламы [email protected]