4.1 संस्करण के रूप में OpenGL में पाठ रेंडरिंग के लिए अत्याधुनिक क्या है? [बन्द है]


199

OpenGL में टेक्स्ट रेंडरिंग के बारे में पहले से ही कई प्रश्न हैं, जैसे:

लेकिन ज्यादातर जिस पर चर्चा की जाती है, वह फिक्स्ड-फंक्शन पाइपलाइन का उपयोग करके बनावट वाले क्वैड्स प्रदान कर रहा है। निश्चित रूप से shaders को एक बेहतर तरीका बनाना चाहिए।

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

आधुनिक ओपनजीएल का उपयोग करके पाठ-प्रतिपादन के लिए अनुशंसित दृष्टिकोण क्या है? (दृष्टिकोण का उपयोग करके मौजूदा सॉफ़्टवेयर का हवाला देना अच्छा सबूत है कि यह अच्छी तरह से काम करता है)

  • ज्योमेट्री शेड्स जो स्वीकार करते हैं उदाहरण के लिए स्थिति और अभिविन्यास और एक चरित्र अनुक्रम और बनावट वाले क्वैड का उत्सर्जन करते हैं
  • ज्योमेट्री शेड्स जो वेक्टर फोंट को प्रस्तुत करते हैं
  • ऊपर के रूप में, लेकिन इसके बजाय tessellation shaders का उपयोग करना
  • फ़ॉन्ट रस्टराइजेशन करने के लिए एक कंप्‍यूटर शेडर

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

QML2 (Qt5 में) OpenGL और दूरस्थ क्षेत्रों के साथ कुछ दिलचस्प ट्रिक्स करता है जब टेक्स्ट रेंडर करते हैं: blog.qt.digia.com/blog/2012/08/08/native-looking-text-in-qml-2
mlvljp

तो मैं इसे फिर से नहीं खोता, यहां एक पुस्तकालय है जो वाल्व की दूरी क्षेत्र विधि को लागू करता है। code.google.com/p/glyphy मैंने इसे आज़माया नहीं है। शायद यह भी देखने लायक है: code.google.com/p/signed-distance-field-font-generator
Timmmm

7
यह "ऑफ-टॉपिक" स्टैक ओवरफ्लो का अभिशाप है। गंभीरता से?
निकोलस गिओटीस

1
अधिक भोली "यह कैसे करना है" संस्करण: stackoverflow.com/questions/8847899/…
Ciro Santilli Sant how how how

जवाबों:


202

रूपरेखा प्रस्तुत करना, जब तक कि आप केवल एक दर्जन वर्णों को प्रस्तुत नहीं करते हैं, अनुमानित वक्रता के लिए प्रति वर्ण आवेशों की संख्या के कारण एक "नहीं जाना" रहता है। हालाँकि, पिक्सेल शैडर में बेज़ियर कर्व्स का मूल्यांकन करने के लिए दृष्टिकोण किया गया है, लेकिन ये आसानी से एंटीअलियास होने से ग्रस्त हैं, जो एक दूरी-मैप-टेक्सचर्ड क्वाड का उपयोग करके तुच्छ है, और छाया में घटता का मूल्यांकन करना अभी भी आवश्यक से बहुत अधिक महंगा है।

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

तकनीक के लिए प्रसिद्ध वाल्व पेपर देखें ।

तकनीक वैचारिक रूप से समान है कि कैसे निहित सतहों (मेटाबॉल और इस तरह) काम करती हैं, हालांकि यह बहुभुज उत्पन्न नहीं करती है। यह पूरी तरह से पिक्सेल शेडर में चलता है और बनावट से दूरी की दूरी को फंक्शन फंक्शन के रूप में लेता है। एक चुने हुए दहलीज (आमतौर पर 0.5) के ऊपर सब कुछ "इन" है, बाकी सब "आउट" है। सबसे सरल मामले में, 10 साल पुराने नॉन-शेडर-सक्षम हार्डवेयर पर, अल्फा टेस्ट थ्रेसहोल्ड को 0.5 पर सेट करने से वह सटीक काम करेगा (हालांकि विशेष प्रभाव और एंटीअलियासिस के बिना)।
यदि कोई फ़ॉन्ट (बोल्ड बोल्ड) के लिए थोड़ा और अधिक वजन जोड़ना चाहता है, तो थोड़ी सी छोटी सीमा कोड की एक भी पंक्ति को संशोधित किए बिना चाल चलेगी (बस अपना "फ़ॉन्ट_वेट" वर्दी बदलें)। एक चमक प्रभाव के लिए, एक बस एक दहलीज के ऊपर "के रूप में" और दूसरे के ऊपर सब कुछ (छोटे) के रूप में "बाहर, लेकिन चमक में", और दोनों के बीच LERPs समझता है। Antialiasing इसी तरह काम करता है।

एकल बिट के बजाय 8-बिट हस्ताक्षरित दूरी मान का उपयोग करके, यह तकनीक आपके बनावट मानचित्र के प्रभावी रिज़ॉल्यूशन को प्रत्येक आयाम में 16 गुना बढ़ाती है (काले और सफेद के बजाय, सभी संभव रंगों का उपयोग किया जाता है, इस प्रकार हमारे पास 256 गुना है एक ही भंडारण का उपयोग कर जानकारी)। लेकिन भले ही आप 16x से आगे बढ़ें, परिणाम अभी भी काफी स्वीकार्य है। लंबी सीधी रेखाएं अंततः थोड़ी सी अस्पष्ट हो जाएंगी, लेकिन कोई विशिष्ट "ब्लॉकी" नमूना आर्टिफैक्ट नहीं होगा।

आप क्वैड्स को पॉइंट्स (बस बैंडविड्थ को कम करने) से उत्पन्न करने के लिए एक ज्यामिति शेडर का उपयोग कर सकते हैं, लेकिन ईमानदारी से लाभ मामूली है। GPG8 में बताए गए इंस्टेंट कैरेक्टर रेंडरिंग के लिए भी यही सही है। यदि आपके पास बहुत सा पाठ है, तो इंस्टेंसिंग का ओवरहेड केवल परिशोधन है । लाभ, मेरी राय में, जोड़ा जटिलता और गैर-डाउनग्रेडबिलिटी के संबंध में नहीं है। साथ ही, आप या तो निरंतर रजिस्टरों की मात्रा तक सीमित हैं, या आपको एक बनावट बफर ऑब्जेक्ट से पढ़ना है, जो कैश सुसंगतता के लिए गैर-इष्टतम है (और इरादा शुरू करने के लिए अनुकूलन करना था!)।
यदि आप समय से थोड़ा आगे अपलोड करते हैं और पिछले 15 वर्षों के दौरान बनाए गए प्रत्येक हार्डवेयर पर चलेंगे, तो एक सरल, सादा पुराना वर्टेक्स बफर बस उतना ही तेज (संभवतः तेज) है। और, यह आपके फॉन्ट में किसी विशेष वर्ण तक सीमित नहीं है, न ही वर्णों की एक विशेष संख्या तक रेंडर करने के लिए।

यदि आप सुनिश्चित हैं कि आपके फ़ॉन्ट में 256 से अधिक वर्ण नहीं हैं, तो बनावट सरणियाँ ज्यामितीय छाया में बिंदुओं से क्वैड उत्पन्न करने के समान बस बैंडविड्थ को बंद करने के लिए एक विचार के लायक हो सकती हैं। एक सरणी बनावट का उपयोग करते समय, सभी quads के बनावट निर्देशांक समान, स्थिर sऔर tनिर्देशांक होते हैं और केवल rनिर्देशांक में भिन्न होते हैं , जो रेंडर करने के लिए वर्ण सूचकांक के बराबर होता है।
लेकिन अन्य तकनीकों की तरह, पिछली पीढ़ी के हार्डवेयर के साथ असंगत होने की कीमत पर अपेक्षित लाभ मामूली है।

जोनाथन डम्मर द्वारा दूरी बनावट उत्पन्न करने के लिए एक उपयोगी उपकरण है: विवरण पृष्ठ

अपडेट:
जैसा कि हाल ही में प्रोग्रामेबल वर्टेक्स पुलिंग (डी। रैकोस, "ओपनग्ल इनसाइट्स, पीपी। 239) में बताया गया है, GPUs की नवीनतम पीढ़ियों में शेडर से प्रोग्रामेटिक डेटा को खींचने के साथ कोई महत्वपूर्ण अतिरिक्त विलंबता या ओवरहेड नहीं है। मानक निर्धारित फ़ंक्शन का उपयोग करके समान करने की तुलना में।
इसके अलावा, GPUs की नवीनतम पीढ़ियों में अधिक से अधिक यथोचित आकार के L2 कैश (जैसे nvidia केपलर पर 1536kiB) होते हैं, इसलिए एक बफर बनावट से क्वाड कोनों के लिए यादृच्छिक ऑफसेट को खींचते समय असंगत पहुंच समस्या की उम्मीद की जा सकती है। संकट।

यह एक बफर बनावट से लगातार डेटा (जैसे क्वाड साइज) को खींचने का विचार अधिक आकर्षक बनाता है। एक काल्पनिक कार्यान्वयन इस प्रकार PCIe और मेमोरी ट्रांसफर, साथ ही GPU मेमोरी को कम कर सकता है, इस तरह से एक दृष्टिकोण के साथ:

  • केवल एक वर्ण अनुक्रमणिका (एक प्रति वर्ण प्रदर्शित किया जा सकता है) को केवल एक शीर्ष shader के लिए एक ही इनपुट के रूप में अपलोड करें जो इस सूचकांक पर गुजरता है और gl_VertexID, और ज्यामिति shader में 4 अंक को बढ़ाता है, फिर भी वर्ण सूचकांक और वर्टेक्स आईडी (यह है) एकमात्र गुण के रूप में "gl_primitiveID को वर्टेकर शेडर में उपलब्ध कराया जाएगा"), और इसे ट्रांसफॉर्मेशन फीडबैक के माध्यम से कैप्चर करें।
  • यह तेज़ होगा, क्योंकि केवल दो आउटपुट विशेषताएँ (जीएस में मुख्य अड़चन) हैं, और यह दोनों चरणों में "नो-ऑप" के करीब है।
  • एक बफ़र बनावट को बांधें, जिसमें फ़ॉन्ट के प्रत्येक वर्ण के लिए, बेस पॉइंट के सापेक्ष बनावट वाले क्वाड के शीर्ष स्थान हैं (ये मूल रूप से "फ़ॉन्ट मैट्रिक्स" हैं)। इस डेटा को केवल बायीं तरफ के ऊपरी हिस्से के ऑफसेट को स्टोर करके 4 क्वाड प्रति क्विंटल तक कंप्रेस्ड किया जा सकता है, और एक्सिस-एलायड बॉक्स की चौड़ाई और ऊंचाई को एन्कोडिंग किया जा सकता है (आधे फ्लोट्स को मानते हुए, यह प्रति कैरेक्टर निरंतर बफर के 8 बाइट्स होंगे - एक विशिष्ट 256 वर्ण फ़ॉन्ट पूरी तरह से एल 1 कैश के 2kiB में फिट हो सकता है)।
  • आधार रेखा के लिए एक समान सेट करें
  • क्षैतिज ऑफसेट के साथ एक बफर बनावट बांधें। ये हो सकता है शायद GPU पर गणना की जा है, लेकिन यह बहुत आसान है और CPU पर बात उस तरह के और अधिक कुशल है, क्योंकि यह एक सख्ती से अनुक्रमिक आपरेशन है और सभी तुच्छ पर नहीं (कर्निंग के बारे में सोच)। इसके अलावा, इसे एक और प्रतिक्रिया पास की आवश्यकता होगी, जो एक और सिंक पॉइंट होगा।
  • फ़ीडबैक बफ़र से पहले जनरेट किए गए डेटा को रेंडर करें, वर्टेक्स शेडर बेस पॉइंट के क्षैतिज ऑफसेट और बफर ऑब्जेक्ट्स से कोने के कोने के किनारों (आदिम आईडी और चरित्र सूचकांक का उपयोग करके) को खींचता है। सबमिट किए गए शीर्षों की मूल शीर्ष आईडी अब हमारी "आदिम आईडी" है (याद रखें जीएस वर्टिकल को क्वाड्स में बदल दिया गया है)।

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

हालांकि, यहां तक ​​कि 75% की कमी को मानते हुए - चूंकि पाठ का "उचित" मात्रा प्रदर्शित करने के लिए शीर्ष डेटा केवल 50-100kiB के आसपास कहीं है (जो व्यावहारिक रूप से शून्य हैएक GPU या एक PCIe बस) - मुझे अभी भी संदेह है कि जोड़ा जटिलता और पीछे की ओर-संगतता खोना वास्तव में परेशानी के लायक है। शून्य को 75% कम करना अभी भी शून्य है। मैंने उपर्युक्त दृष्टिकोण को स्वीकार नहीं किया है, और वास्तव में योग्य कथन बनाने के लिए और अधिक शोध की आवश्यकता होगी। लेकिन फिर भी, जब तक कि कोई व्यक्ति वास्तव में आश्चर्यजनक प्रदर्शन अंतर (पाठ के "सामान्य" मात्राओं का उपयोग करके, अरबों वर्णों का नहीं!) प्रदर्शित कर सकता है, मेरा दृष्टिकोण यह है कि शीर्ष डेटा के लिए, एक साधारण, सादे पुराने वर्टेक्स बफर पर्याप्त रूप से अच्छा है "कला समाधान की स्थिति" का हिस्सा माना जाता है। यह सरल और सीधा है, यह काम करता है, और यह अच्छी तरह से काम करता है।

ऊपर पहले से ही " ओपनग्ल इनसाइट्स " संदर्भित होने के बाद , यह स्टीफन गुस्तावसन द्वारा अध्याय "2 डी शेप रेंडरिंग द्वारा डिस्टेंस फील्ड्स" को भी इंगित करने के लायक है, जो महान विस्तार में दूरी क्षेत्र प्रतिपादन बताते हैं।

अपडेट २०१६:

इस बीच, कई अतिरिक्त तकनीकें मौजूद हैं, जिनका लक्ष्य कोने के चक्करों को दूर करना है जो अत्यधिक परिमाण में परेशान हो जाते हैं।

एक दृष्टिकोण बस दूरस्थ क्षेत्रों के बजाय छद्म दूरी वाले क्षेत्रों का उपयोग करता है (अंतर यह है कि दूरी वास्तविक रूपरेखा के लिए नहीं बल्कि सबसे छोटी दूरी है, लेकिन रूपरेखा या किनारे पर एक काल्पनिक रेखा है)। यह कुछ हद तक बेहतर है, और एक ही गति (समान शेडर) पर चलता है, समान मात्रा में बनावट मेमोरी का उपयोग करता है।

एक अन्य दृष्टिकोण तीन-चैनल बनावट विवरण और मध्य में उपलब्ध जीथिन में माध्यिका-ऑफ़-थ्री का उपयोग करता है । इसका उद्देश्य समस्या को संबोधित करने के लिए पहले उपयोग किए गए एंड-या हैक पर सुधार होना है। अच्छी गुणवत्ता, थोड़ा, लगभग ध्यान देने योग्य नहीं, धीमा, लेकिन बनावट बनावट के रूप में तीन गुना अधिक उपयोग करता है। इसके अलावा, अतिरिक्त प्रभाव (जैसे चमक) सही पाने के लिए कठिन हैं।

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


1
वे काफी अच्छे दिखते हैं (भोली छन छन कर भी और अनुपस्थिति में भी, क्योंकि आपके पास बहुत छोटे बनावट हैं और डेटा अच्छी तरह से प्रक्षेपित होता है)। व्यक्तिगत रूप से मुझे लगता है कि वे कई मामलों में "वास्तविक" चीज़ से भी बेहतर दिखते हैं , क्योंकि संकेत देने में कोई विषमताएं नहीं हैं, जो अक्सर उन चीजों का उत्पादन करती हैं जिन्हें मैं "अजीब" मानता हूं। उदाहरण के लिए, छोटा पाठ अचानक बिना किसी स्पष्ट कारण के लिए बोल्ड नहीं होता है, न ही पिक्सेल सीमाओं के लिए पॉप - प्रभाव जो आप अक्सर "वास्तविक" फोंट के साथ देखते हैं। उसके ऐतिहासिक कारण हो सकते हैं (1985 b / w डिस्प्ले), लेकिन आज, यह मेरी समझ से परे है कि ऐसा क्यों होना चाहिए।
डेमन

2
काम करता है और बहुत अच्छा लगता है, साझा करने के लिए धन्यवाद! उन लोगों के लिए जो एचएलएसएल के पतले शेडर स्रोत चाहते हैं, यहां देखें । (या ) के clip(...)साथ लाइन को बदलकर आप इसे GLSL के लिए अनुकूलित कर सकते हैं । HTH। if (text.a < 0.5) {discard;}text.a < threshold
इंजीनियर

1
अद्यतन के लिए धन्यवाद। काश मैं फिर से उत्थान कर पाता।
बेन वोइगट

2
@ निचलोलस: आपको लगता है कि आपने बहुत ध्यान से नहीं पढ़ा है। दोनों प्रश्नों के उत्तर में बताया गया है। केप्लर को "नवीनतम जीन" उदाहरण के रूप में दिया गया है, कोई दूसरा पास नहीं है (और यह क्यों समझाया गया है), और मैं बताता हूं कि मुझे विश्वास नहीं है कि काल्पनिक बैंडविड्थ-बचत तकनीक काफ़ी तेजी से या परेशानी के लायक है। हालांकि, विश्वास का अर्थ कुछ भी नहीं है - किसी को जानने की कोशिश करनी होगी (मैं तब से नहीं कर रहा हूं जब तक कि मैं "सामान्य" मात्रा को पाठ में अड़चन नहीं मानता। यह तब भी सार्थक हो सकता है जब कोई बैंडविड्थ के बारे में बेताब हो और पाठ की "असामान्य" मात्रा हो।
डेमोन

3
@ नाइकोल बॉल्स: आप उस वाक्य के बारे में सही हैं, क्षमा करें। यह वास्तव में थोड़ा भ्रामक है। पिछले पैराग्राफ में, मैंने लिखा था "एक शायद GPU पर भी इसे उत्पन्न कर सकता है, लेकिन इसके लिए प्रतिक्रिया और ... isnogud की आवश्यकता होगी।" - लेकिन फिर "प्रतिक्रिया बफर से उत्पन्न डेटा" के साथ गलत तरीके से जारी रखा गया । मैं इसे सही करूंगा। वास्तव में, मैं सप्ताहांत पर पूरी बात फिर से लिखूंगा, इसलिए यह कम अस्पष्ट है।
डेमन

15

http://code.google.com/p/glyphy/

GLyphy और अन्य SDF-आधारित OpenGL रेंडरर्स के बीच मुख्य अंतर यह है कि अधिकांश अन्य प्रोजेक्ट SDF को एक बनावट में नमूना करते हैं। यह सभी सामान्य समस्याएं हैं जिनका नमूना है। अर्थात। यह रूपरेखा को विकृत करता है और निम्न गुणवत्ता वाला है। इसके बजाय जीएलवाई एसडीएफ का प्रतिनिधित्व करता है जो कि जीपीयू में प्रस्तुत वास्तविक वैक्टर का उपयोग करता है। यह बहुत ही उच्च गुणवत्ता प्रदान करता है।

नकारात्मक पक्ष यह है कि कोड OpenGL ES के साथ iOS के लिए है। मैं शायद एक Windows / Linux OpenGL 4.x पोर्ट बनाने जा रहा हूं (उम्मीद है कि लेखक कुछ वास्तविक दस्तावेज जोड़ देगा, हालांकि)।


3
GLYphy में रुचि रखने वाले किसी को भी लेखक की बात लिनक्स पर देखना चाहिए ।conf.au 2014: youtube.com/watch?v=KdNxR5V7prk
Fizz

14

सबसे व्यापक तकनीक अभी भी बनावट वाले क्वैड हैं। हालाँकि 2005 में LORIA ने वेक्टर टेक्सचर नामक कुछ चीज़ों को विकसित किया, यानी वेक्टर ग्राफिक्स को आदिम पर टेक्सचर के रूप में प्रस्तुत किया। यदि कोई इसका उपयोग ट्रू टाइप या ओपन टाइप फोंट को वेक्टर बनावट में बदलने के लिए करता है, तो आपको यह मिलता है:

http://alice.loria.fr/index.php/publications.html?Paper=VTM@2005


2
क्या आप इस तकनीक का उपयोग करके किसी भी कार्यान्वयन के बारे में जानते हैं?
ल्यूक

2
नहीं (जैसा कि प्रोडक्शन-ग्रेड में), लेकिन किल्गार्ड के पेपर (लिंक के लिए मेरा जवाब नीचे देखें) की एक संक्षिप्त आलोचना है, जिसे मैं संक्षेप में बताता हूं: अभी तक व्यावहारिक नहीं है। क्षेत्र में अधिक शोध हुआ है; किल्गार्ड द्वारा उद्धृत अधिक हालिया काम में research.microsoft.com/en-us/um/people/hoppe/ravg.pdf और uwspace.uwaterloo.ca/handle/10012/4262
Fizz

9

मुझे आश्चर्य है कि मार्क किलगार्ड का बच्चा, NV_path_rendering (NVpr), उपरोक्त में से किसी द्वारा भी उल्लेख नहीं किया गया था। हालाँकि इसके लक्ष्य फॉन्ट रेंडरिंग की तुलना में अधिक सामान्य हैं, लेकिन यह फोंट से पाठ और कर्निंग के साथ रेंडर भी कर सकता है। इसके लिए OpenGL 4.1 की भी आवश्यकता नहीं है, लेकिन यह एक विक्रेता / एनवीडिया-केवल एक्सटेंशन है। यह मूल रूप से फोंट को पथों में बदल देता है, glPathGlyphsNVजो कि मेट्रिक्स आदि प्राप्त करने के लिए freetype2 लाइब्रेरी पर निर्भर करता है। फिर आप glGetPathSpacingNVमार्ग के उपयोग से पाठ प्रदर्शित करने के लिए NVpr के सामान्य पथ रेंडरिंग तंत्र का उपयोग कर सकते हैं। (मैंने इसे उद्धरणों में रखा है, क्योंकि कोई वास्तविक रूपांतरण नहीं है, वक्र का उपयोग किया जाता है।)

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

फोंट भाग के लिए 2011 की एनवीपीआर एपीआई प्रस्तुति बात करती है यहां शुरू होती है और अगले भाग में जारी रहती है ; यह थोड़ा दुर्भाग्यपूर्ण है कि यह प्रस्तुति कैसे विभाजित है।

NVpr पर अधिक सामान्य सामग्री:

  • एनवीडिया एनवीपीआर हब , लेकिन लैंडिंग पेज पर कुछ सामग्री सबसे अद्यतित नहीं है
  • सिग्राफ 2012 का पेपरपथ-प्रतिपादन विधि के दिमाग के लिए , जिसे "स्टैंसिल, फिर कवर" (StC) कहा जाता है; पेपर यह भी संक्षेप में बताता है कि Direct2D की तरह प्रतिस्पर्धी तकनीक कैसे काम करती है। फ़ॉन्ट-संबंधित बिट्स को कागज के एक अनुलग्नक में वापस कर दिया गया है । वे भी हैंवीडियो / डेमो जैसे कुछ एक्स्ट्रा
  • जीटीसी 2014 प्रस्तुतिअद्यतन स्थिति के लिए ; संक्षेप में: यह अब Google के Skia द्वारा समर्थित है (Nvidia ने 2013 और 2014 के अंत में कोड का योगदान दिया), जिसका उपयोग Google Chrome और [स्वतंत्र रूप से Skia के स्वतंत्र रूप से, मुझे लगता है] Adobe Illustrator CC 2014 के एक बीटा में किया गया है।
  • OpenGL एक्सटेंशन रजिस्ट्री में आधिकारिक दस्तावेज
  • यूएसपीटीओ ने NVpr के संबंध में किलगार्ड / एनवीडिया को कम से कम चार पेटेंट प्रदान किए हैं, जिनमें से शायद आपको इस बारे में पता होना चाहिए, यदि आप अपने द्वारा StC लागू करना चाहते हैं: US8698837 , US8698808 , US8704830 और US8730253 । ध्यान दें कि कुछ और भी हैं जैसे कि यूएसपीटीओ के 17 से अधिक दस्तावेज "इस रूप में भी प्रकाशित" हैं, जिनमें से अधिकांश पेटेंट अनुप्रयोग हैं, इसलिए यह पूरी तरह से संभव है कि उन से अधिक पेटेंट प्रदान किए जा सकें।

और जब से मेरे उत्तर से पहले "स्टैंसिल" शब्द ने इस पृष्ठ पर कोई हिट नहीं बनाई, तब यह एसओ समुदाय का सबसेट प्रतीत होता है, जिसने इस पृष्ठ पर भाग लिया, जो बहुत सारे होने के बावजूद अनौपचारिक रूप से टेसल-फ्री, स्टैंसिल-बफर से अनजान था। सामान्य रूप से पथ / फ़ॉन्ट रेंडरिंग के लिए आधारित विधियाँ। किलगार्ड ने ए opengl मंच पर अक्सर पूछे जाने वाले प्रश्न होते हैं, जो -फ्री पाथ रेंडरिंग के तरीके bog मानक 3D ग्राफिक्स से भिन्न हैं, भले ही वे अभी भी एक [GP] GPU का उपयोग कर रहे हों। (NVpr को CUDA- सक्षम चिप की आवश्यकता है।)

ऐतिहासिक परिप्रेक्ष्य के लिए, किल्गार्ड क्लासिक "अ सिंपल ओपनगैल -आधारित एपीआई फॉर टेक्सचर मैप्ड टेक्स्ट", एसजीएस, 1997 के लेखक भी हैं। , जिसे 2011 में शुरू किए गए स्टैंसिल-आधारित एनवीपीआर के साथ भ्रमित नहीं होना चाहिए।


यदि इस पृष्ठ पर हाल ही के सभी तरीकों पर चर्चा नहीं की गई है, जिसमें स्टैंसिल-आधारित विधियाँ जैसे NVpr या SDF- आधारित विधियाँ जैसे GLYphy (जो कि मैं यहाँ और आगे चर्चा नहीं कर रहा हूँ क्योंकि अन्य उत्तर पहले से ही इसे कवर करते हैं) में एक सीमा है: वे हैं पारंपरिक (~ 100 डीपीआई) पर बड़े पाठ प्रदर्शन के लिए उपयुक्त, स्केलिंग के किसी भी स्तर पर गुड़ के बिना मॉनिटर करता है, और वे उच्च-डीपीआई, रेटिना जैसे डिस्प्ले पर भी, छोटे आकार में भी अच्छे लगते हैं। वे पूरी तरह से प्रदान नहीं करते हैं जो Microsoft के Direct2D + DirectWrite आपको देता है, अर्थात् मुख्यधारा के प्रदर्शनों पर छोटे ग्लिफ़ की ओर इशारा करता है। (सामान्य रूप से संकेत करने के एक दृश्य सर्वेक्षण के लिए उदाहरण के लिए इस टाइपकोथेक पृष्ठ देखें । अधिक गहराई से संसाधन एंटीग्रेन डॉट कॉम पर है। ।)

मैं किसी भी ओपन एंड प्रोडक्टेड ओपेनगेल-आधारित सामान के बारे में नहीं जानता जो इस समय Microsoft को संकेत देने के साथ कर सकता है। (मैं एप्पल के ओएस एक्स जीएल / क्वार्ट्ज इंटर्नल्स के लिए अज्ञानता स्वीकार करता हूं, क्योंकि मेरे ज्ञान का सबसे अच्छा करने के लिए एप्पल ने प्रकाशित नहीं किया है कि वे जीएल-आधारित फ़ॉन्ट / पथ प्रतिपादन सामान कैसे करते हैं। ऐसा लगता है कि ओएस एक्स, मैकओएस 9 के विपरीत नहीं है। सभी पर इशारा करते हैं, जो कुछ लोगों को परेशान करता है ।) वैसे भी, एक 2013 का शोध पत्र है, जो कि ओंगिया के निकोलस पी। रूजियर द्वारा लिखित ओपनजीएल शेड्स के माध्यम से संकेत देता है ; यदि आप OpenGL से संकेत करना चाहते हैं तो यह संभवतः पढ़ने लायक है। हालांकि ऐसा लग सकता है कि लाईट लाईट की तरह एक पुस्तकालय पहले से ही काम करता है जब यह इशारा करता है, कि वास्तव में निम्नलिखित कारण से ऐसा नहीं है, जिसे मैं कागज से उद्धृत कर रहा हूं:

FreeType लाइब्रेरी RGB मोड में उप-पिक्सेल एंटी-अलियासिंग का उपयोग करके एक ग्लिफ़ को रैस्टोर कर सकती है। हालाँकि, यह समस्या का केवल आधा हिस्सा है, क्योंकि हम भी ग्लिफ़ के सही स्थान के लिए उप-पिक्सेल स्थिति प्राप्त करना चाहते हैं। आंशिक पिक्सेल निर्देशांक पर बनावट वाले क्वाड को प्रदर्शित करने से समस्या हल नहीं होती है, क्योंकि यह पूरे पिक्सेल स्तर पर केवल बनावट प्रक्षेप में परिणाम करता है। इसके बजाय, हम उप-डोमेन में एक सटीक बदलाव (0 और 1 के बीच) प्राप्त करना चाहते हैं। यह एक टुकड़ा shader में किया जा सकता है [...]।

समाधान बिल्कुल तुच्छ नहीं है, इसलिए मैं इसे यहां समझाने की कोशिश नहीं कर रहा हूं। (पेपर ओपन-एक्सेस है।)


एक और चीज़ जो मैंने रूगिएर के पेपर से सीखी है (और जिसे किल्गार्ड ने नहीं माना है) लगता है कि फॉन्ट शक्तियाँ (Microsoft + Adobe) ने एक नहीं बल्कि दो कर्निंग विनिर्देशन तरीके बनाए हैं। पुराना एक तथाकथित kern table पर आधारित है और इसे freetype द्वारा समर्थित किया गया है। नए को GPOS कहा जाता है और यह मुफ्त सॉफ्टवेयर की दुनिया में हार्फबज या पंगो जैसे नए फॉन्ट लाइब्रेरी द्वारा समर्थित है। चूंकि NVpr उन पुस्तकालयों में से किसी एक का समर्थन नहीं करता है, इसलिए कुछ नए फोंट के लिए NVP के साथ कर्नेल बॉक्स से बाहर काम नहीं कर सकता है; इस मंच चर्चा के अनुसार, वहाँ स्पष्ट रूप से जंगली में से कुछ हैं ।

अंत में, यदि आपको जटिल पाठ लेआउट (CTL) करने की आवश्यकता है, तो आप वर्तमान में OpenGL के साथ भाग्य से बाहर हैं क्योंकि कोई OpenGL- आधारित लाइब्रेरी उसके लिए मौजूद नहीं है। (दूसरी ओर DirectWrite CTL को संभाल सकते हैं।) हार्फबज जैसी खुली खटास वाली लाइब्रेरी हैं जो CTL को प्रस्तुत कर सकती हैं, लेकिन मुझे नहीं पता कि आप उन्हें कैसे अच्छी तरह से काम करने के लिए प्राप्त करेंगे (जैसे कि स्टैंसिल-आधारित विधियों का उपयोग करके) ओपन। संभवतः आपको पुन: आकार की रूपरेखा निकालने और उन्हें पथ के रूप में NVpr या SDF- आधारित समाधानों में फीड करने के लिए गोंद कोड लिखना होगा।


4
मैंने NV_path_rendering का उल्लेख नहीं किया क्योंकि यह एक विस्तार है, मामलों को बदतर बनाने के लिए एक विक्रेता मालिकाना। मैं आमतौर पर केवल तकनीकों के लिए उत्तर देने की कोशिश करता हूं जो सार्वभौमिक रूप से लागू होती हैं।
डेटेनवॉल्फ

1
खैर, मैं इससे कुछ हद तक सहमत हो सकता हूं। स्वयं विधि ("स्टैंसिल, फिर कवर") ओपन ओपन में सीधे लागू करने के लिए वास्तव में मुश्किल नहीं है, लेकिन यह उच्च कमांड ओवरहेड होगा यदि भोली तरीके से किया जाता है, जैसा कि पूर्व स्टैंसिल-आधारित प्रयास समाप्त हो गया था। किलिया के अनुसार स्किया [गणेश के माध्यम से] ने एक स्टैंसिल-आधारित समाधान की कोशिश की, लेकिन इसे छोड़ दिया। Nvidia द्वारा जिस तरह से इसे लागू किया गया है, नीचे एक परत, CUDA क्षमताओं का उपयोग करके, यह प्रदर्शन करता है। आप EXT / ARB एक्सटेंशन के एक पूरे समूह का उपयोग करके अपने आप को "मेंटल" करने की कोशिश कर सकते हैं। लेकिन खबरदार कि NVpr पर किलगार्ड / एनवीडिया के दो पेटेंट एप्लिकेशन हैं।
फिज़ा

3

मुझे लगता है कि आपका सबसे अच्छा शर्त ओपनग्रो बैकएंड के साथ कैरो ग्राफिक्स में देखना होगा ।

एकमात्र समस्या जब मुझे 3.3 कोर के साथ एक प्रोटोटाइप विकसित करना ओपनगेल बैकएंड में फ़ंक्शन उपयोग का पदावनत किया गया था। यह 1-2 साल पहले की स्थिति में सुधार हो सकता है ...

वैसे भी, मुझे उम्मीद है कि भविष्य के डेस्कटॉप ओपेंगल ग्राफिक्स ड्राइवर ओपनवीजी को लागू करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.