2010-03-15 13 views
7

में बहुभाषी यूनिकोड प्रतिपादन मुझे अंतर्राष्ट्रीय पात्रों (विशेष रूप से हिब्रू, अरबी और सिरिलिक) का समर्थन करने के लिए ओपनजीएल-रेंडरिंग सिस्टम का विस्तार करना होगा। (| विस्टा | XP 7)ओपनगल

विकास मंच विंडोज है, Embercardero डेल्फी 2010

मैं वर्तमान में wglOutLineFont का उपयोग (...) glCallLists(length(m_Text), UNSIGNED_SHORT, PWchar(m_Text)) का उपयोग कर मेरे फ़ॉन्ट के प्रदर्शन सूची बनाने के लिए और मेरे तार रेंडर करने के लिए अफसोस।

हालांकि यह लैटिन -1 अक्षरों के लिए व्यवहार्य है, पूर्ण यूनिकोड चरित्र सेट अग्रिम में निर्माण करना काफी समय लेने वाला है (मेरी मशीन पर लगभग 8.5 मिनट), इसलिए मैं एक और अधिक कुशल समाधान की तलाश में हूं। मैंने आपको + 0020 - यू +07 एफ (लैटिन, यूनानी, सिरिलिक, अरबी और हिब्रू) से रेंज को सीमित करने के बारे में सोचा था, जिसमें मुझे केवल ग्लिफ चाहिए, लेकिन यह मेरी वर्तमान जरूरतों के लिए एक समाधान होगा, और एक बार अपर्याप्त हो जाएगा अन्य एन्कोडिंग की आवश्यकता है।

ऊपर की ओर, मुझे बाएं से दाएं या दाएं से बाएं दिशा के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि हमारा एप्लिकेशन पहले से ही इसे संभाल सकता है।

मुझे उम्मीद है कि यह एक प्रसिद्ध समस्या होगी, इसलिए मैं यह पूछना चाहूंगा कि वेब पर इस पर कोई संदर्भ सामग्री है या आप इस पर कुछ अंतर्दृष्टि साझा कर सकते हैं?

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

इसके अतिरिक्त, चूंकि एक दृश्य शायद ही कभी अधिक सौ वर्ण (मुख्य रूप से लेबल और माप) से अधिक हो जाता है, पूर्व-रास्टराइजेशन से गति लाभ नगण्य है।

उत्तर

3

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

+0

वर्टेक्स बफर ऑब्जेक्ट्स का उपयोग करना बहुत अच्छा होगा!फ़ॉन्ट रास्टर्स उच्च रिज़ॉल्यूशन में हो सकते हैं, फिर mipmaps और multisampling बाकी करते हैं। – Luca

+0

तो मेरा मतलब है कि मुझे सूचियां उत्पन्न करनी चाहिए जब मुझे पता चले कि मुझे कौन से पात्रों को किसी दिए गए स्ट्रिंग के लिए आकर्षित करने की आवश्यकता होगी? – sum1stolemyname

+0

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

1

मेरे पास this tutorial सी ++ में अच्छी किस्मत लिप्यंतरण है, हालांकि मुझे यकीन नहीं है कि यह डेल्फी में कितना अच्छा स्थानांतरित होगा।

2

आपको wglOutLineFont को प्रतिस्थापित करने की आवश्यकता है।

ऐसा करने के लिए, wglOutLineFont का उपयोग करके आवश्यक ग्लिफ बनाकर उत्पन्न/प्रस्तुत करें, और फिर बनावट को रास्टर छवि फ़ाइल में सहेजें। एक बार एप्लिकेशन लोड हो जाने पर, इसे बनावट छवि और ग्लाइफ बनावट निर्देशांक (प्रत्येक ग्लिफ के लिए 4 कॉर्ड) लोड करने की आवश्यकता होती है, और डिस्प्ले सूचियां उत्पन्न करने के लिए (प्रत्येक ग्लिफ के लिए एक सूची, प्रत्येक डिस्प्ले सूची एक सिंगल ग्लाइफ को बनावट क्वाड के रूप में खींचती है)।

प्रत्येक ग्लाइफ का प्रतिनिधित्व करने वाला प्रत्येक छोटा एक समान प्रदर्शन सूची (उनके मूल्य का अधिक मिलान होगा, और ग्लिलिस्टबेस इस में सहायता कर सकता है)।

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

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