سؤال

أقوم بالعرض في كائن مخزن إطارات خارج الشاشة لـ OpenGL وأرغب في حفظه كصورة.نلاحظ أن مكتب العمليات الفيدرالية أكبر من حجم العرض.يمكنني تقديمه إلى المخزن المؤقت الموجود خارج الشاشة واستخدامه كنسيج، وهو ما يعمل.يمكنني "تمرير" هذا النسيج الأكبر عبر الشاشة باستخدام الإزاحة، مما يجعلني واثقًا من أنني سأعرضه في سياق أكبر من النافذة.

إذا قمت بحفظ المخزن المؤقت الموجود خارج الشاشة في ملف صورة، فسيتم اقتصاصه دائمًا.جزء التعليمات البرمجية للحفظ هو:

void ofFBOTexture::saveImage(string fileName) { 
    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
    // get the raw buffer from ofImage
    unsigned char* pixels = imageSaver.getPixels();
    glReadPixels(0, 0, 1024, 1024, GL_RGB, GL_UNSIGNED_BYTE, pixels); 

    imageSaver.saveImage(fileName); 
} 

يرجى ملاحظة أنه تم اقتصاص محتوى الصورة، وحفظ الجزء المرئي بشكل صحيح (مما يعني عدم وجود خطأ في تنسيقات البكسل، أو مشكلات GL_RGB وما إلى ذلك)، ولكن يتم ملء المساحة المتبقية بلون واحد.

لذا، سؤالي هو - ما الخطأ الذي أفعله؟

هل كانت مفيدة؟

المحلول

وأخيراً قمت بحل المشكلة.

لا بد لي من تفعيل fbo لحفظ محتوياته:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
// save code
...
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

أثناء اختيار fbo فقط لـ glReadPixels عبر

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);

لا يكفي.

(جميع الأشياء الأخرى صحيحة ومختبرة، على سبيل المثال.أحجام إطار العرض وعرض المخزن المؤقت وارتفاعه ونسيج الصورة وما إلى ذلك)

نصائح أخرى

سؤالان للبدء:كيف تقوم بإنشاء imageSaver وهل أنت متأكد من صحة العرض والارتفاع (على سبيل المثال؟هل تحاول حفظ صورة بحجم 1024 × 1024؟ما الحجم الذي ستحصل عليه)؟

أنت لا ترتكب أي خطأ، لقد كان هذا سلوكًا شائعًا جدًا مع برامج تشغيل الرسومات OpenGL لفترة طويلة - أتذكر أنني واجهت نفس المشكلة تمامًا على بطاقات nVidia Geforce 3 منذ عقد من الزمن على الأقل، واعتمدت حلاً مشابهًا - تقديم إلى نسيج خارج الشاشة.

يبدو أن حجم إطار العرض لديك خاطئ أو شيء مشابه.

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