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

StackOverflow https://stackoverflow.com//questions/25071248

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top