2012-05-05 15 views
5

लघु:जीएलएसएल पुन: प्रयोज्य/साझा फ़ंक्शंस, साझा स्थिरांक (ओपनजीएल ईएस 2.0)?

क्या मैं एक ऐसे फ़ंक्शन को परिभाषित कर सकता हूं जो प्रत्येक शेडर उपयोग कर सके? या मुझे प्रति शेडर को परिभाषित करना है?


पूरी कहानी:

  • मैं पूर्वनिर्धारित ढाल रैंप के साथ इनपुट टुकड़े colorize करने के लिए (- http://www.thinkboxsoftware.com/storage/krakatoa-support-images/krakatoa15_kcm_densitybyage_gradientrampmap.png कुछ इस तरह) का इरादा कई shaders बनाना चाहते हैं।

  • मैं हर शेडर के लिए एक ढाल रैंप लगातार परिभाषित करने के लिए (vec4 रंग नमूने की एक सरणी, जहां अल्फा मूल्य ढाल स्थान रखता है, ऊपर चित्र में स्थिति देखें)

  • चाहते और मैं की जरूरत है एक फ़ंक्शन जो किसी विशेष बनावट समन्वय स्थिति के लिए दिए गए ग्रेडियेंट रैंप से रंग नमूना लौटा सकता है।

तो रैंप शेडर प्रति एक बार परिभाषित करने की आवश्यकता है, और समारोह परिभाषित सभी को एक बार है कि हर शेडर सुरक्षित रूप से उपयोग कर सकते हैं होना चाहिए।

मेरे पास एल्गोरिदम हैं, प्रश्न साझाकरण कार्यों के लिए है, और जीएलएसएल में स्थिरांक परिभाषित करता है।

क्या यह संभव है? या मुझे फ़ंक्शन को हर शेडर में कॉपी करना होगा? क्या कम से कम कुछ प्रीकंपाइल विकल्प है?

उत्तर

9

आप सी के समान ही कर सकते हैं - आप हेडर में फ़ंक्शंस घोषित करते हैं और इसे सामान्य सी फ़ाइल में परिभाषित करते हैं। आप समारोह को परिभाषित (यह सामान्य फोन की सुविधा देता है)

  1. कुछ शेडर (स्ट्रिंग) में

    :

    GLSL में आप निम्न कार्य करने होंगे

    float getCommonValue() { return 42; } 
    
  2. सभी shaders आप चाहते हैं में

    इस फ़ंक्शन का उपयोग करने के लिए आप केवल इसे घोषित करते हैं और इसका उपयोग करते हैं (इसे SHADER1 कहते हैं):

    float getCommonValue(); 
    void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); } 
    
  3. जब glCompileShader साथ shaders संकलन आप केवल एक बार आम शेडर और दुकान शेडर GLuint कहीं

  4. संकलन जब आप SHADER1 के लिए glLinkProgram साथ कार्यक्रम लिंक आप glAttachShader दोनों shaders के साथ कार्यक्रम देते हैं - आम और SHADER1। इस प्रकार आप एक शेडर से दूसरे में getCommonValue फ़ंक्शन को कॉल करने में सक्षम होंगे।

  5. आप अलग-अलग साहहर कार्यक्रमों (SHADER1, SHADER2, ...) के लिए कई बार COMMON शेडर GLuint मान का पुन: उपयोग कर सकते हैं।

+0

वाह, अच्छा लगता है, मैं इसे आज़माउंगा। – Geri

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