रूपरेखा प्रस्तुत करना, जब तक कि आप केवल एक दर्जन वर्णों को प्रस्तुत नहीं करते हैं, अनुमानित वक्रता के लिए प्रति वर्ण आवेशों की संख्या के कारण एक "नहीं जाना" रहता है। हालाँकि, पिक्सेल शैडर में बेज़ियर कर्व्स का मूल्यांकन करने के लिए दृष्टिकोण किया गया है, लेकिन ये आसानी से एंटीअलियास होने से ग्रस्त हैं, जो एक दूरी-मैप-टेक्सचर्ड क्वाड का उपयोग करके तुच्छ है, और छाया में घटता का मूल्यांकन करना अभी भी आवश्यक से बहुत अधिक महंगा है।
"तेज़" और "गुणवत्ता" के बीच सबसे अच्छा व्यापार-बंद अभी भी हस्ताक्षरित दूरी क्षेत्र बनावट के साथ बनावट वाले 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 डी शेप रेंडरिंग द्वारा डिस्टेंस फील्ड्स" को भी इंगित करने के लायक है, जो महान विस्तार में दूरी क्षेत्र प्रतिपादन बताते हैं।
अपडेट २०१६:
इस बीच, कई अतिरिक्त तकनीकें मौजूद हैं, जिनका लक्ष्य कोने के चक्करों को दूर करना है जो अत्यधिक परिमाण में परेशान हो जाते हैं।
एक दृष्टिकोण बस दूरस्थ क्षेत्रों के बजाय छद्म दूरी वाले क्षेत्रों का उपयोग करता है (अंतर यह है कि दूरी वास्तविक रूपरेखा के लिए नहीं बल्कि सबसे छोटी दूरी है, लेकिन रूपरेखा या किनारे पर एक काल्पनिक रेखा है)। यह कुछ हद तक बेहतर है, और एक ही गति (समान शेडर) पर चलता है, समान मात्रा में बनावट मेमोरी का उपयोग करता है।
एक अन्य दृष्टिकोण तीन-चैनल बनावट विवरण और मध्य में उपलब्ध जीथिन में माध्यिका-ऑफ़-थ्री का उपयोग करता है । इसका उद्देश्य समस्या को संबोधित करने के लिए पहले उपयोग किए गए एंड-या हैक पर सुधार होना है। अच्छी गुणवत्ता, थोड़ा, लगभग ध्यान देने योग्य नहीं, धीमा, लेकिन बनावट बनावट के रूप में तीन गुना अधिक उपयोग करता है। इसके अलावा, अतिरिक्त प्रभाव (जैसे चमक) सही पाने के लिए कठिन हैं।
अंत में, वास्तविक बीज़ियर घटता हुआ पात्रों को संचय करना, और एक टुकड़ेदार छाया में उनका मूल्यांकन करना व्यावहारिक हो गया है , थोड़ा हीन प्रदर्शन (लेकिन इतना नहीं है कि यह एक समस्या है) और उच्चतम परिमाण पर आश्चर्यजनक परिणाम भी।
वेबलॉग डेमो यहां उपलब्ध वास्तविक समय में इस तकनीक के साथ एक बड़े पीडीएफ का प्रतिपादन करता है ।