Windows API का उपयोग करके XNA में मनमाना पाठ रेंडर करना?


9

मेरे अन्य प्रश्न पर एंड्रयू की टिप्पणी में , उन्होंने नोट किया कि टेक्स्ट को सीधे एक SpriteBatch के साथ पाठ को खींचने के बजाय, Windows API का उपयोग करके Texture2D को प्रस्तुत करना संभव था। यह कैसे किया जाता है? मुझे लगता है कि Texture2D पर छवि डेटा लिखने से पहले एक मध्यवर्ती कदम है।

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

जवाबों:


4

कुछ प्रतिबिंब का उपयोग करके, आप Direct3D सतह सूचक को Texture2D से पकड़ सकते हैं। वहां से, आप किसी भी एपीआई का उपयोग कर सकते हैं जो एक डीएक्स सतह को प्रस्तुत कर सकता है। मैंने हाल ही में WPF के D3DImage (अल्फा चैनल समर्थन के साथ) के साथ XNA सामग्री की मेजबानी करने के लिए ऐसा किया था। DirectWrite एक DX सतह को प्रस्तुत कर सकता है, और आप प्रबंधित API का उपयोग करने में सक्षम भी हो सकते हैं । उस लिंक में DirectX .NET रैपर केवल Direct3D 10 और 11 का समर्थन करता है, और Direct3D 9 का समर्थन नहीं करता है (जो XNA AFBIK का उपयोग करता है)। हालाँकि, आप अभी भी इसे प्राप्त करने में सक्षम हो सकते हैं। एक साइड नोट पर, यदि आप वेक्टर ग्राफिक्स को रेंडर करना चाहते हैं, तो आप Direct2D के साथ एक समान दृष्टिकोण का उपयोग करने में सक्षम हो सकते हैं। स्वाभाविक रूप से, इसमें से कोई भी विंडोज के अलावा किसी भी XNA- समर्थित प्लेटफॉर्म पर काम नहीं करेगा।


1
मैं सिर्फ यह बताना चाहता हूं कि आप xna के लिए विंडो हैंडल भी प्राप्त कर सकते हैं और इसे win32 पैनल जैसी किसी चीज को रेंडर करने के लिए कह सकते हैं। तब आप किसी भी विधि का उपयोग कर सकते हैं जिसे आप गेम के शीर्ष पर प्रस्तुत करना चाहते हैं क्योंकि आप बस बैकबफ़र को एक win32 नियंत्रण के लिए आकर्षित कर रहे हैं। यह बहुत गंदा है, लेकिन यह मेरे लिए अच्छी तरह से काम करता है जब मैंने टैबलेट पीसी इनपुट पैनल को एक्सएनए के साथ विलय कर दिया। परिणाम वही था जो एक मानक XNA विंडो के रूप में प्रकट हुआ था, लेकिन अदृश्य हस्तलिपि पहचान के साथ। मैंने बस xna के ऊपर स्ट्रोक प्रदर्शित किए। बेशक पाठ / लेबल / बटन भी काम करेंगे। हालाँकि, मैंने WPF के साथ यह कोशिश नहीं की है।
zfedoran

1
मुझे लगता है कि आपकी विधि के साथ "एरोस्पेस" मुद्दे होंगे, अरियु। क्या आप अल्फा चैनल के साथ XNA विंडो के शीर्ष पर सामग्री को प्रस्तुत करने में सक्षम थे? सामान्य नियम यह है कि एक पिक्सेल केवल एक ग्राफिक्स एपीआई द्वारा "स्वामित्व" हो सकता है, जो पारदर्शी या पारभासी सामग्री के साथ समस्याओं का कारण बनता है। यदि यह आपकी पद्धति के लिए भी सही है, तो यह ठोस रंग पृष्ठभूमि के अलावा किसी भी चीज़ के पाठ को प्रस्तुत करने के लिए समस्याग्रस्त होगा।
माइक स्ट्रोबेल

क्षमा करें, मैं थोड़ा भ्रमित हो सकता था। मैंने जिस विधि का वर्णन किया है वह पैनल को उसकी पृष्ठभूमि पर एक बनावट खींचने के लिए और कुछ नहीं बताती है। इसी तरह कि आप कैसे एक छवि बॉक्स को बता सकते हैं कि किस छवि को आकर्षित करना है। लेकिन बनावट / छवि के बजाय फ़ाइल होने के कारण यह xna बैकबफ़र है। मैं पैनल या खिड़की के ऊपर या उसके ऊपर ड्राइंग नहीं कर रहा था। इसलिए "एयरस्पेस" के साथ कोई समस्या नहीं थी।
zfedoran

ओह समझा। तो आपका दृष्टिकोण बहुत ही समान है कि मैंने WPF (D3DImage का उपयोग करके) में XNA सामग्री को कैसे होस्ट किया है। एक विशिष्ट बिटमैप स्रोत के बजाय, छवि स्रोत एक XNA / Direct3D सतह है। मैं मानता हूं कि उपलब्ध विकल्पों को देखते हुए यह सबसे अच्छा तरीका है - कोई हवाई क्षेत्र के मुद्दे नहीं हैं, और प्रदर्शन बहुत अच्छा है क्योंकि किसी भी अनावश्यक नकल / ब्लिटिंग की आवश्यकता नहीं है।
माइक स्ट्रोबेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.