2012-05-03 14 views
5

लेने के लिए अपने आवेदन में मैं दो उद्देश्यों के लिए एक QGLWidget की सामग्री की फोटो ले:कैसे विश्वसनीय QGLWidget स्नैपशॉट

  • दृश्य पुनः बनाने नहीं सभी समय था जब केवल एक उपरिशायी परिवर्तन, बजाय
  • एक कैश्ड पिक्समैप का उपयोग कर लैट उपयोगकर्ता विशेष प्लॉट्स (3 डी दृश्य) के स्क्रीनशॉट लेते हैं

पहली बात मैंने कोशिश की है grabFrameBuffer()। पहले चरण के लिए इस फ़ंक्शन का उपयोग करना स्वाभाविक है, वर्तमान में विजेट में जो दिखाई देता है वह वही है जो मैं कैश करना चाहता हूं। समस्या: कुछ हार्डवेयर (जैसे इंटेल इंटीग्रेटेड ग्राफिक्स, जीईफ़ोर्स ग्राफिक्स के साथ मैक ओएस एक्स) पर, प्राप्त छवि में वर्तमान स्क्रीन सामग्री नहीं है, लेकिन इससे पहले की सामग्री। तो यदि दृश्य दो बार खींचा जाएगा, तो स्क्रीन पर आप दूसरी ड्राइंग देखते हैं, छवि में आप पहली ड्राइंग देखते हैं (जो बैकबफर की सामग्री होनी चाहिए?)।

दूसरी बात मैंने कोशिश की है renderToPixmap()। यह paintGL() का उपयोग करता है, लेकिन paint() का उपयोग नहीं करता है। मेरे पास paint() में मेरी सारी चीज़ें हैं, क्योंकि मैं क्यूटी की पेंटिंग कार्यक्षमता का उपयोग करता हूं और कोड का केवल एक छोटा टुकड़ा देशी जीएल (beginNativePainting(), endNativePainting()) का उपयोग करता है।

मैंने नियमित QWidget की स्नैपशॉट क्षमता (QPixmap :: fromWidget(), या जिसे इसे कहा जाता है) भी कोशिश की, लेकिन वहां जीएल फ्रेमबफर काला है।

इस मुद्दे को हल करने और वर्तमान में खींचे गए दृश्य का विश्वसनीय चित्रण प्राप्त करने के बारे में कोई भी विचार?

उत्तर

2

कैसे विश्वसनीय QGLWidget स्नैपशॉट लेने के लिए

, फ्रेमबफर करने के लिए वर्तमान दृश्य प्रस्तुत दायर करने के लिए फ्रेमबफर से डेटा को बचाने के। या GlFlush के बाद वर्तमान बैकबफर पकड़ो। कुछ और कलाकृतियों या अपूर्ण दृश्य शामिल हो सकता है।

+0

मैं एक एफबीओ के साथ काम करना समाप्त कर दिया। – ypnos

1

QGLWidget::grabFrameBuffer() का परिणाम, अन्य सभी ओपनजीएल कॉल की तरह, वीडियो ड्राइवर पर निर्भर करता है। क्यूटी केवल ड्राइवर को आपकी कॉल अग्रेषित करती है और जिस छवि को लौटाती है उसे पकड़ लेती है, लेकिन छवि की सामग्री क्यूटी के नियंत्रण में नहीं है। यह सुनिश्चित करने के अलावा कि आपने अपने वीडियो कार्ड के लिए नवीनतम ड्राइवर स्थापित किया है, आप अपने वीडियो कार्ड निर्माता को बग की रिपोर्ट करने और प्रार्थना करने के अलावा बहुत कुछ नहीं कर सकते हैं।

0

मैं paintGL(); और glFlush() का उपयोग करता हूं; grabFrameBuffer() का उपयोग करने से पहले। पेंटजीएल फ्रेम बफर को पकड़ने से पहले फिर से मौजूदा फ्रेम खींचने में मदद करता है, जो वर्तमान में जो दिखा रहा है उसकी एक सटीक प्रति बनाता है।

2

ऐसा लगता है कि QGLWidget :: grabFrameBuffer() आंतरिक रूप से OpenGL से glReadPixels() को कॉल करता है। डबल-बफरड कॉन्फ़िगरेशन पर प्रारंभिक मोड बैक बफर (GL_BACK) को पढ़ता है, स्क्रीन पर एक छवि प्रदर्शित करने वाले QGLWidget :: grabFrameBuffer() का उपयोग करने से पहले ओपनजीएल कॉल glReadBuffer (GL_FRONT) के साथ फ्रंट बफर पर स्विच करें।

संबंधित मुद्दे