2010-11-09 13 views
15

क्या वेक्टर ग्राफिक्स फ़ाइल लोड करने का कोई तरीका है और फिर इसे OpenGL का उपयोग करके प्रस्तुत करना है? यह एक अस्पष्ट सवाल है क्योंकि मुझे वेक्टर ग्राफिक्स के लिए फ़ाइल प्रारूपों के बारे में बहुत कुछ पता नहीं है। मैं एसवीजी के बारे में जानता हूं, यद्यपि।ओपनजीएल में वेक्टर ग्राफिक्स प्रस्तुत करना?

इसे रास्टर में बदलना वास्तव में सहायक नहीं है क्योंकि मैं वस्तुओं पर वास्तविक समय ज़ूम करना चाहता हूं।

+0

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

+1

असल में, यह वही सवाल है जैसे http://stackoverflow.com/questions/4054612/2d-vector-graphic-renderer-for-opengl – Fizz

उत्तर

6

मुझे ग्रेग के उत्तर पर विस्तार करने दें।

यह सच है कि क्यूटी में एक एसवीजी रेंडरर क्लास, QSvgRenderer है। साथ ही, क्यूटी में जो भी चित्र आप करते हैं, उसे "क्यूपेंटडिवाइस" पर किया जा सकता है, जहां हमें निम्नलिखित "पेंट डिवाइसेस" में रुचि है:

  • एक क्यूटी विजेट;
  • विशेष रूप से, एक जीएल-आधारित क्यूटी विजेट (QGLWidget);
  • एक क्यूटी छवि

इसलिए, यदि आप क्यूटी उपयोग करने का निर्णय, अपने विकल्प हैं: खिड़की की स्थापना (और जीएल संदर्भ) के अपने वर्तमान पद्धति का उपयोग करके

  1. बंद करो, और का उपयोग शुरू आपके सभी प्रतिपादन के लिए QGLWidget, जिसमें एसवीजी प्रतिपादन शामिल है। आपकी जरूरतों के आधार पर यह एक बहुत छोटा बदलाव हो सकता है। QGLWidget विशेष रूप से इसकी क्षमताओं में सीमित नहीं है।
  2. QIvgRenderer का उपयोग QImage को प्रस्तुत करने के लिए करें, फिर उस QImage से डेटा को एक जीएल बनावट (जैसा कि आप सामान्य रूप से करेंगे) में डाल दें, और इसे किसी भी तरह से प्रस्तुत करें (उदा। आयताकार जीएल_क्वैड में)। अन्य विधि की तुलना में खराब प्रदर्शन हो सकता है लेकिन आपके कोड में कम से कम परिवर्तन की आवश्यकता है।

आश्चर्य है कि QGLWidget वास्तव में क्या करता है? खैर, जब आप QTLWidget को Qt प्रतिपादन आदेश जारी करते हैं, तो उन्हें आपके लिए जीएल कॉल में अनुवादित किया जाता है। और यह तब भी होता है जब एसवीजी रेंडरर द्वारा प्रतिपादन आदेश जारी किए जाते हैं। तो अंत में, आपका एसवीजी जीएल प्राइमेटिव्स (लाइन, बहुभुज, आदि) के गुच्छा के माध्यम से प्रस्तुत किया जा रहा है।

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

जब आप रीयलटाइम में ज़ूम कर रहे हों तो QImage विधि का उपयोग कर सकते हैं। यह सिर्फ इस बात पर निर्भर करता है कि आपको कितनी तेज़ी से इसकी आवश्यकता है। आपको सावधानीपूर्वक अनुकूलन की आवश्यकता हो सकती है जैसे कि समान QImage का पुन: उपयोग करना, और अपने QPainter के लिए क्लिपिंग सक्षम करना।

0

इसमें अंतरिक्ष में रेखाओं को रेखांकित करने के लिए GL_LINES और GL_LINE_STRIP जैसे प्राइमेटिव हैं यदि आपका यही मतलब है। संपादित करें: http://www.falloutsoftware.com/tutorials/gl/gl2p5.htm

+0

मेरा प्रश्न स्पष्ट करें। – Jookia

2

Qt सीधे ओपन कार्यक्षमता (QSvgRenderer के दस्तावेज़ देखें) का उपयोग कर SVG चित्र प्रतिपादन के लिए अच्छा समर्थन हासिल है: इस साइट में कुछ जानकारी है।

मुझे उम्मीद है कि इससे मदद मिलती है।

5

यह कार्यान्वयन नहीं है, लेकिन आपके प्रश्न और दर्शकों के लिए बहुत प्रासंगिक है।

अध्याय 25. प्रतिपादन वेक्टर कला GPU https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html

+1

लिंक टूटा हुआ है (और यह अनिवार्य रूप से एक लिंक-केवल उत्तर है ...) – chtz

+0

कोई फर्क नहीं पड़ता कि यह केवल एक लिंक है, यह अभी भी उपयोगी है। –

8

मैं जवाब में से अधिकांश देख पर क्यूटी के बारे में किसी भी तरह कर रहे हैं, भले ही मूल प्रश्न यह उल्लेख नहीं है।

2011 के बाद से, कला के राज्य मार्क किल्गार्ड के बच्चे है, NV_path_rendering: यहाँ अकेले ओपन के मामले में मेरा उत्तर (जो भी समय बीतने से काफी फायदा होता है, के रूप में यह 2010 में नहीं दिया जा सकता था) है , जो वर्तमान में केवल एक विक्रेता (एनवीडिया) एक्सटेंशन है क्योंकि आपने पहले से ही इसके नाम से अनुमान लगाया होगा। उस पर सामग्री का एक बहुत कुछ कर रहे हैं:

NV_path_rendering अब दृश्य, जब उपलब्ध पीछे गूगल के Skia पुस्तकालय द्वारा किया जाता है। (एनवीडिया ने 2013 और 2014 के अंत में कोड का योगदान दिया।)

आप निश्चित रूप से एसवीजी और ऐसे https://www.youtube.com/watch?v=bCrohG6PJQE लोड कर सकते हैं। वे पथ के लिए पोस्टस्क्रिप्ट वाक्यविन्यास का भी समर्थन करते हैं। तुम भी पथ मिश्रण कर सकते हैं अन्य ओपन (3 डी) सामान के साथ प्रतिपादन, के रूप में पर डेमो:

और भी कम (या पूरी तरह नहीं) होने एक नवोदय विक्रेता समर्थन या शैक्षिक चकाचौंध नैनोवीजी है, जिसे वर्तमान में विकसित और बनाए रखा गया है। (https://github.com/memononen/nanovg) ओपनजीएल पर 2 डी पुस्तकालयों की संख्या को देखते हुए जो समय के साथ आते हैं और चले गए हैं, आप मेरी विनम्र राय में किसी प्रमुख विक्रेता द्वारा समर्थित कुछ का उपयोग करके एक बड़ी शर्त ले रहे हैं।

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