سؤال

أحاول نقل مشروع سابق إلى فئات Qt5 OpenGL الجديدة.أريد تقديم نسيج باستخدام FBO.استخدم الكود السابق مواد متعددة قمت بإرفاقها بـ FBO عند الطلب.لذلك، أود أن أرفق كائن نسيج معين، وأقوم بالعرض، وأرفق نسيجًا آخر وأجري عملية مختلفة وأقوم بعرض الإخراج على النسيج المرفق حديثًا، وما إلى ذلك.

كنت أتساءل كيف يمكنني القيام بذلك باستخدام فئات Qt5 OpenGL.على سبيل المثال، لا أستطيع معرفة كيفية إرفاق شيء معين QOpenGLTexture يعترض على أ QOpenGLFrameBufferObject حتى أتمكن من تقديمه.أستطيع أن أرى أن هناك texture() طريقة و أ takeTexture() طريقة.لكن كلاهما يعيدان معرف النسيج فقط.وأيضا كيف يمكنني تغيير وحدة النسيج النشطة؟على سبيل المثال، أريد أخذ عينة من نسيجين في برنامج التظليل الخاص بي.لذلك، أحتاج إلى ربط نسيجين بوحدات نسيج مختلفة.

للتوضيح، المشكلة الرئيسية التي أواجهها مع واجهة برمجة التطبيقات الجديدة هي أنني لا أرى أي طريقة فيها 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 bugtracker لدعم أهداف العرض المتعددة (MRT) لـ QOpenGLFramebufferObject.إنه قيد التقدم حاليًا ويبدو أن مراجعة الكود فقط هي في انتظار المراجعة.

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

لذا ترقبوا سجلات التغيير لإصدارات Qt المستقبلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top