मोबाइल उपकरणों के लिए ट्रिगर भारी शेड को गति देने के लिए LUT का उपयोग करना


10

मैं इस shader को वास्तव में पुराने iDevice पर चलाने के लिए, साथ ही साथ Android में भी कोशिश कर रहा हूं ।

यहां तक ​​कि जब मैं प्रति टुकड़ा नीचे 2 साइन कार्यों के लिए कोड को कम करता हूं, तो शेडर लगभग 20fps पर चलता है।

मैंने पुरानी छायांकन तकनीकों की पुस्तक से एक पत्ती लेने और एक सरणी बनाने पर विचार किया है जो पूर्वनिर्धारित ट्रिगर मूल्यों का एक गुच्छा रखता है और किसी तरह से shader को अनुमानित करने के लिए उनका उपयोग करता है।

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

वैसे भी मेरे पास दो दुविधाएं हैं:

  1. मुझे नहीं पता कि GLSL शेडर, निरंतर या वर्दी में 360 मूल्यों की एक सरणी के लिए सबसे कुशल तरीका क्या है?
  2. मैं यह पता नहीं लगा सकता कि किसी संख्या को एक सीमा में कैसे रखा जाए जैसे आमतौर पर अगर मुझे 0 और 360 के बीच का कोण चाहिए होता है (हाँ मुझे पता है कि जीपीयू रेडियंस का उपयोग करते हैं) तो मैं ऐसा करूंगा।

    func range(float angle)
    {
       float temp = angle
       while (temp > 360) {temp -= 360;}
       while (temp < 0)   {temp += 360;}
       return temp;
    }
    

    हालांकि जीएलएसएल लूप या पुनरावर्ती कार्यों की अनुमति नहीं देता है।


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

5
# 2 के संबंध में, अंतर्निहित modफ़ंक्शन वह है जो आप चाहते हैं। आप लिखेंगे mod(angle, 360.0)
नाथन रीड

1
@trichoplax शानदार विचार लेकिन मुझे नहीं पता कि आप तब टेबल पर मूल्यों को कैसे देख पाएंगे। मान लें कि हमने उन्हें एक सरणी में रखा है, जिनमें से कुछ अधिक सांद्र हैं। हम सही सूचकांक कैसे पा सकते हैं?
जे। जूल

6
कैसे एक 3-चैनल 1D बनावट में अपने मूल्यों को रखने के बारे में? इस तरह आप एक एकल बनावट देखने की कीमत के लिए पाप, कॉस और टैन निकाल सकते हैं। यदि आप 0 - 2pi कोण से 0 - 1 UV पर मैप करते हैं और रिपीट टेक्सटाइल मोड का उपयोग करते हैं, तो आपको मॉड कॉल की भी आवश्यकता नहीं है, यह स्वचालित रूप से 'रैप' करेगा, और आप इसके बजाय अपने संग्रहीत मूल्यों के बीच रैखिक-फ़िल्टर किए गए सन्निकटन प्राप्त कर सकते हैं। सबसे पास का तड़क।
रस

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

जवाबों:


8

[0,360)[0,2π)

  • [0,360][0,1]
  • आपको अपना लूप-जैसे अंतराल समायोजन नहीं करने का अतिरिक्त लाभ मिलता है (हालांकि, आपको किसी भी तरह से लूप की आवश्यकता नहीं होगी और बस एक मापांक ऑपरेशन का उपयोग कर सकते हैं)। बस GL_REPEATबनावट के लिए रैपिंग मोड के रूप में उपयोग करें और यह तर्क 1 (और इसी तरह नकारात्मक तर्क के लिए) तक पहुंचने पर स्वचालित रूप से फिर से शुरुआत में शुरू होगा
  • और आपको मूल रूप से मुफ्त में सरणी में दो मानों के बीच रैखिक रूप से प्रक्षेप करने का लाभ भी मिलता है (या मान लें कि हम लगभग स्वतंत्र हैं) GL_LINEARबनावट फ़िल्टर के रूप में उपयोग करके , इस तरह से उन मूल्यों को प्राप्त करना जो आपने भी स्टोर नहीं किए थे। बेशक त्रिकोणमितीय कार्यों के लिए रैखिक प्रक्षेप 100% सटीक नहीं है, लेकिन यह निश्चित रूप से बिना प्रक्षेप के बेहतर है ।
  • आप RGBA बनावट (या फिर कई घटकों की आवश्यकता होती है) का उपयोग करके बनावट में एक से अधिक मान संग्रहीत कर सकते हैं । इस तरह आप एकल बनावट के साथ पाप और कॉस प्राप्त कर सकते हैं।
  • [-1,1][0,1]float sin = 2.0 * (texValue.r + texValue.g / 256.0) - 1.0;(या महीन अनाज के लिए और भी अधिक घटक)। यह आपको फिर से बहु-घटक बनावट से लाभ देता है।

बेशक यह अभी भी मूल्यांकन किया जाना है कि क्या यह एक बेहतर समाधान है, क्योंकि बनावट का उपयोग पूरी तरह से स्वतंत्र नहीं है, साथ ही साथ बनावट के आकार और प्रारूप का सबसे अच्छा संयोजन क्या होगा।

डेटा के साथ बनावट को भरने और अपनी टिप्पणियों में से एक के रूप में, आपको यह विचार करना होगा कि टेक्सटाइल फ़िल्टरिंग टेक्सल सेंटर में सटीक मान लौटाता है , यानी बनावट टेक्सल के आधे आकार से समन्वयित होती है। तो हाँ, आपको टेक्सल्स पर मान उत्पन्न.5 करना चाहिए , अर्थात एप्लिकेशन कोड में कुछ इस तरह:

float texels[256];
for(unsigned int i = 0; i < 256; ++i)
    texels[i] = sin((i + .5f) / 256.f) * TWO_PI);
glTexImage1D(GL_TEXTURE_1D, 0, ..., 256, 0, GL_RED, GL_FLOAT, texels);

uniform float sinTable[361]glUniform1fv[0,360)mod

angle = mod(angle, 360.0);
float value = sinTable[int(((angle < 0.0) ? (angle + 360.0) : angle) + 0.5)];

1
यहाँ बनावट में टेबल देखने के लिए एक दिलचस्प विस्तार है। यह (एब) डेटा बिंदुओं, सतहों, वॉल्यूम और हाइपोवर्ल्यूम्स के उच्च क्रम प्रक्षेप (रैखिक से बेहतर उर्फ) प्राप्त करने के लिए एन-लीनियर बनावट प्रक्षेप का उपयोग करता है। blog.demofox.org/2016/02/22/…
एलन वोल्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.