2012-01-31 17 views
5

मैं एक एंड्रॉइड एप्लिकेशन, मैं इस सतह के अन्य कशेरुक पर फैलती सतह की सामान्य गणना करना चाहता हूं। मैं इसे "मास्टर" प्रोग्राम में नहीं करना चाहता क्योंकि इसमें काफी समय लगता है। प्रत्येक शिखर के लिए वास्तव में मैं प्रत्येक vextex के लिए 4 नाव सरणी पारित:ओपनजीएल एस 2 में वर्टेक्स शेडर प्रोग्राम में अन्य वर्टेक्स तक कैसे पहुंचे?

attribute vec3 a_bottom; 
attribute vec3 a_left; 
attribute vec3 a_right; 
attribute vec3 a_top; 

vec3 calculNormal() { 
    return normalize(cross((a_left - a_right) , (a_bottom - a_top))); 
} 

यह बहुत बहुत गंदे कोड मुझे पता है बहुत है, इसलिए बजाय 4 सरणियों पास करने का, मैं ऐसा करना चाहते:

vec3 calculNormal() { 
    vec3 a_left = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - 1 ]; 
    vec3 a_bottom = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - X ]; 
    ... 
    return normalize(cross((a_left - a_right) , (a_bottom - a_top))); 
} 

तो वर्तमान में फ्लोट बफर को स्वीकार करने के लिए एक कशेरुक शेडर प्रोग्राम में यह संभव है? क्या वर्तमान फ्लोट जैसे विशेष कीवर्ड हैं? या क्या कोई और संभावना है कि मुझे याद आती है?

उत्तर

8

यह वास्तव में संभव नहीं है। एक कशेरुक शेडर के पास केवल वर्तमान में संसाधित वर्टेक्स और इसके गुणों तक पहुंच है। और चूंकि ओपनजीएल ईएस में texture_buffer_object एक्सटेंशन नहीं है, इसलिए आप एक शेडर के अंदर एक वीबीओ के डेटा तक नहीं पहुंच सकते हैं। इसलिए एक कशेरुक पड़ोसियों तक पहुंचने का एकमात्र तरीका स्पष्ट रूप से उन्हें अपने पहले उदाहरण में, जैसे चरम विशेषताओं में डाल रहा है।

लेकिन ऐसा लगता है कि आपकी ज्यामिति एक आयताकार पैटर्न है, इसलिए आप इसे एक बनावट में भी स्टोर कर सकते हैं (या इसे एक प्रतिलिपि बना सकते हैं, pixel_buffer_object एक्सटेंशन ईएस में समर्थित होने पर इसकी सहायता कर सकता है)। इस मामले में आप केवल एक क्लासिक जीपीजीपीयू खंड शेडर का उपयोग कर सकते हैं, जो आउटपुट छवि के प्रत्येक "पिक्सेल" (इस मामले में एक वर्टेक्स) के मानदंडों की गणना करता है (इस मामले में आयताकार ज्यामिति का सामान्य डेटा) के मूल्यों के आधार पर इसके पड़ोसियों (साधारण बनावट के उपयोग से पहुंचा)।

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

4

मैं इस सतह के अन्य चरम पर स्थित सतह की सामान्य गणना करना चाहता हूं।

गलत दृष्टिकोण। मानदंडों की गणना करें और उन्हें एक साथ शिखर के साथ स्टोर करें।

मैं इसे "मास्टर" प्रोग्राम में नहीं करना चाहता क्योंकि इसमें अधिक समय लगता है।

आपको प्रत्येक प्रतिपादन पास के लिए मानकों का पुनर्मूल्यांकन नहीं करना चाहिए। बस उन्हें एक की गणना करें और उन्हें स्टोर करें। कशेरुक शेडर में गणना मुफ्त में नहीं है। और वीएस में मानदंडों की गणना करना प्रसंस्करण शक्ति का अपशिष्ट है।

उनकी गणना करें, उन्हें स्टोर करें।

+0

हाय डेटनवॉल्फ। अगर मैं रनटाइम पर ऑब्जेक्ट बनाने के बाद एक ऊंचाईमैप का नमूना देना चाहता हूं तो क्या होगा? क्या मुझे इसे ऊंचाई के नमूने के नमूने के लिए एक शेडर के माध्यम से चलाया जाना चाहिए, शिखर को बदलना, इसे वापस भेजना, फिर एक और वीबीओ अपलोड करना चाहिए? मुझे नहीं लगता कि सीपीयू पर एक बनावट का नमूना वास्तव में रास्ता है, अच्छी तरह से एक चीज के लिए glTexImage का उपयोग करके बनावट अपलोड की गई है और सीपीयू में वास्तव में यह नहीं है। – Zebrafish

+1

@ टिटोनमोरीस: मूल प्रश्न सामान्य मेष के बारे में था। लेकिन ऊंचाईमैप एक विशेष मामला है, जहां सतह सामान्य को सही कर्नेल (असतत अंतर, उर्फ ​​ढाल कर्नेल) के साथ एक रूपांतरण का उपयोग करके गणना की जा सकती है। 'TextureGather' (GLSL-4 और बाद में) का उपयोग करके टेक्स्ट के 2 × 2 ग्रिड को लाया जा सकता है, जो आपको इसके लिए आवश्यक है।हालांकि मैं अभी भी मानदंडों को सटीक करने की अनुशंसा करता हूं, जो आपको बनावट के लिए * सामान्य मानचित्र * प्रभावी रूप से प्रभावी बनाता है। – datenwolf

+1

@TitoneMaurice: अनुप्रयोग विचार: उच्च रिज़ॉल्यूशन पर ऊंचाईमैप बनाएं, उस से सामान्य मानचित्र उत्पन्न करें, रोशनी की गणना के लिए पूर्ण संकल्प सामान्य मानचित्र (खंड टुकड़े में) का उपयोग करें और वर्टेक्स विस्थापन के लिए डाउनस्म्प्लेड ऊंचाईमैप। आगे विचार: आप पूर्ण रिज़ॉल्यूशन ऊंचाई-सामान्य-मानचित्र स्टोर कर सकते हैं और वर्टेक्स चरण में कम रिज़ॉल्यूशन लोड तक पहुंच सकते हैं और खंड के शेडर में पूर्ण रिज़ॉल्यूशन और वर्टेक्स ऊंचाई मान के बीच अंतर का उपयोग दृश्य गुणवत्ता बढ़ाने के लिए लंबन मैपिंग में इनपुट के रूप में करते हैं। – datenwolf

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