2011-04-18 22 views
7

मैंने अपने लिए काफी चुनौतीपूर्ण चुनौती ली है। मेरे एक्सएनए गेम में, मैं Blargg's NTSC filter को कार्यान्वित करना चाहता हूं। यह एक सी लाइब्रेरी है जो बिटमैप को बदलती है ताकि ऐसा लगता है कि यह एनटीएससी मानक के साथ एक सीआरटी टीवी पर आउटपुट था। यह वास्तव में काफी सटीक है।सी से सी # और एचएलएसएल अनुवाद: क्या यह संभव होगा?

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

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

  1. पूर्व में अनुमानित सरणी शामिल है जिसमें 1,048,576 पूर्णांक शामिल हैं। क्या यह पिक्सेल शेडर के लिए किसी भी सीमा से परे अकेला है? इसे केवल एक बार सेट करने की जरूरत है, प्रति फ्रेम एक बार नहीं।
  2. भले ही यह ठीक है, मुझे पता है कि एचएलएसएल एक चर द्वारा सरणी को इंडेक्स नहीं कर सकता है। सही सरणी तत्व प्राप्त करने के लिए बयान अगर इसे दस लाख में अनलॉक करना है। क्या यह प्रदर्शन को मार देगा और इसे फिर से एक निष्फल प्रयास करेगा? प्रति पिक्सेल एकाधिक सरणी एक्सेस हैं।
  3. क्या कोई मौका है कि लाइब्रेरी का उपयोग करने की मेरी मूल योजना काम कर सकती है? मुझे बस तेज़ होने की जरूरत है।
  4. मैंने पहले कभी एक शेडर नहीं लिखा है। क्या मुझे कुछ और पता होना चाहिए?

संपादित करें: # 2 में जोड़ें। मैंने अभी कहीं पढ़ा है कि न केवल एचएलएसएल चर द्वारा अरणों तक पहुंच नहीं सकता है, बल्कि इसे अनलॉक करने के लिए भी, सूचकांक संकलन समय पर गणना योग्य होना चाहिए। क्या यह सच है, या "अनियंत्रित" इसे हल करता है? यदि यह सच है तो मुझे लगता है कि मैं खराब हूं। उसके चारों ओर किसी भी तरह से? मेरा एल्गोरिदम मूल रूप से एक गौरवशाली संस्करण है "इनपुट पिक्सेल यह रंग है, इसलिए इस विशाल सरणी में मेरे आउटपुट पिक्सेल मान देखें।"

उत्तर

2

शेडर भाषाओं की सीमित समझ से, आपकी समस्या आसानी से सरणी के बजाय बनावट का उपयोग करके हल की जा सकती है।

  1. इसे सीपीयू पर पूर्वनिर्धारित करें और फिर बनावट के रूप में सहेजें। आपके मामले में 1024x1024।
  2. मानक बनावट एक्सेस फ़ंक्शंस का उपयोग करें जैसे कि बनावट सरणी थी। व्यक्तिगत पिक्सेल के मिश्रण को सीमित करने के लिए निकटतम पड़ोसी का उपयोग करना।
  3. मुझे नहीं लगता कि यदि आप गति चाहते हैं तो यह संभव है।
+0

तो क्या मैं एक बनावट को सरणी के रूप में उपयोग कर सकता हूं? क्या आप विस्तारित कर सकते हैं? मेरा विशाल सरणी सीधे पिक्सेल डेटा नहीं है। यह सिर्फ संख्या है, मुझे यकीन नहीं है कि वे क्या प्रतिनिधित्व करते हैं। आउटपुट पिक्सेल इस सरणी से मूल्यों का एक गुच्छा जोड़कर पाया जाता है, इसे क्लैंप कर रहा है, फिर इसे कुछ सूत्र के साथ आरजीबी में बदल रहा है। – Tesserex

+0

खुद में बनावट संख्याओं की एक सरणी नहीं है? तो आप इसे एक शेडर के अंदर सरणी के प्रकार के रूप में उपयोग कर सकते हैं। – Euphoric

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