2010-12-05 16 views
6

मैं एक सीएडी-जैसी ऐप (क्यूटी-आधारित) बना रहा हूं, यह एक से अधिक दस्तावेज़ इंटरफ़ेस होगा और प्रत्येक दस्तावेज़ में लगभग 5 व्यूपोर्ट (QGLWidget से व्युत्पन्न) होंगे। इस तरह मुझे अपने फ्लैट शेडर को पूरे एप्लिकेशन में साझा करने की आवश्यकता है, और उसके बाद 3 डी संपत्तियां (वीबीओ के रूप में संग्रहीत मॉडल) को प्रत्येक दस्तावेज़ में साझा किया जाना चाहिए यानी 5 व्यूपोर्ट्स।ओपनजीएल संसाधनों को साझा करने के लिए रणनीति

मैंने सोचा कि जब तक मैंने शेडर प्रोग्राम और वीबीओ ग्लूंट पते के आसपास साझा किया है, तो सभी स्वचालित रूप से काम करेंगे - ऐसा नहीं है। मुझे लगता है क्योंकि प्रत्येक व्यूपोर्ट/संदर्भ में ग्राफिक्स कार्ड पर इसका अपना पता स्थान है, अगर कोई बेहतर जानता है तो कृपया सूचित करें!

मैं आवेदन शुरू करने पर शेडर संकलित करना चाहता हूं, लेकिन यह मुश्किल साबित हो रहा है क्योंकि मुझे पहले वैध ओपनजीएल को वैध स्थिति में प्राप्त करने के लिए एक वैध QGLWidget की आवश्यकता है। लेकिन जैसा कि मुझे QGLWidgets (उनके कन्स्ट्रक्टर के माध्यम से) साझा करने के लिए संसाधनों को साझा करने की आवश्यकता है, अन्य को बनाने की आवश्यकता है और को दिखाया गया है, इससे पहले कि दूसरों को तत्काल किया जा सके। लेकिन यह बहुत अव्यवहारिक है क्योंकि उपयोगकर्ता को एक बार में कई दृश्य दिखाए जा सकते हैं।

यह बनाना आसान है क्योंकि मैं इसे बाहर कर रहा हूं क्योंकि यह शायद ही कभी महत्वपूर्ण है, लेकिन मैं वास्तव में संघर्ष कर रहा हूं - क्या कोई मुझे सही दिशा में इंगित कर सकता है?

धन्यवाद, कैम

उत्तर

11

यहाँ हमेशा की तरह सीएडी/एमडीआई अनुप्रयोगों कर रहे है:

  • वे एक साझा संदर्भ कि के लिए अच्छी तरह से कार्य करता है, संसाधनों को साझा पैदा करते हैं।

  • साझा संदर्भ के संसाधन आईडी तक पहुंच प्रदान करने के लिए एक नया ओपनजीएल प्रतिपादन संदर्भ बनाते समय वे wglShareLists का उपयोग करते हैं।

wglShareLists VBOs, बनावट, shaders, आदि साझा करने के लिए इस्तेमाल किया जा सकता, न केवल प्रदर्शन सूचियों (साझा करने DLs विरासत उपयोग, इसलिए समारोह नाम है)।

मुझे याद नहीं है कि आपको साझा संदर्भ के साथ संसाधन बनाने की आवश्यकता है या यदि आप उन्हें किसी भी संदर्भ पर बना सकते हैं।

यदि आप विंडोज़ पर नहीं हैं, तो glXCreateContext देखें। आपको ट्रैक पर रखना चाहिए।

संपादित करें:

मैं क्यूटी को देखा है, यह है कि यह सदस्य QGLContext::create साथ निकाला गया है लग रहा है।

+2

उत्कृष्ट! QGLContext अलगाव में एक कूड़े का एक छोटा सा हिस्सा है, डिस्प्ले डिवाइस केवल एक बार डिस्प्ले डिवाइस बनने के बाद ही चलाया जा सकता है, जो मेरे मामले में QGLWidget के अंदर है। तो मैं अपने shader संकलन संदर्भ के रूप में एक _invisible_ QGLWidget बनाउंगा, फिर उस दस्तावेज़ के छिपे हुए QGLWidget के निर्माता में कॉन्स्ट QGLWidget * shareWidget तर्क के रूप में पास करता हूं जिसमें VBO डेटा होता है, और वह विजेट दृश्य दृश्य QGLWidgets पर पास हो जाता है। अनिवार्य रूप से एक QGLWidget पेड़ पदानुक्रम बनाने। अदृश्य जीयूआई घटकों को बनाना मुश्किल से उत्तम दर्जे का है, लेकिन पोर्टिंग की बात आने पर यह बहुत सारे टाइपिंग को बचाएगा। – cmannett85

+0

@ cmannett85 दरअसल, यह * वर्ग * है, का प्रकार: http://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8/ – mlvljr

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

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