ओपनजीएल: मैं कहां से शेड करता हूं?


17

मैं OpenGL ES 2.0 सीखने की कोशिश कर रहा हूं और मैं सोच रहा हूं कि shaders को "प्रबंधित" करने का सबसे आम अभ्यास क्या है।
मैं यह सवाल इसलिए पूछ रहा हूं क्योंकि मैंने जो उदाहरण पाया है (जैसे कि एंड्रॉइड एसडीके के साथ प्रदान की गई एपीआई डेमो में शामिल है), मैं आमतौर पर GLRenderer वर्ग के अंदर सब कुछ देखता हूं और मैं चीजों को अलग कर सकता हूं इसलिए मेरे पास हो सकता है, उदाहरण के लिए, एक GLImage ऑब्जेक्ट जिसे मैं पुन: उपयोग कर सकता हूं जब भी मैं एक टेक्सचर्ड क्वाड खींचना चाहता हूं (मैं इस समय केवल 2 डी पर ध्यान केंद्रित कर रहा हूं), ठीक उसी तरह जैसे मैंने अपने ओपनजीएल ईएस 1.0 कोड में किया था। लगभग हर उदाहरण में मैंने पाया है, shaders को केवल वर्ग विशेषताओं के रूप में परिभाषित किया गया है। उदाहरण के लिए:

public class Square {

public final String vertexShader =
        "uniform mat4 uMVPMatrix;\n" +
        "attribute vec4 aPosition;\n" +
        "attribute vec4 aColor;\n" +
        "varying vec4 vColor;\n" +
        "void main() {\n" +
        "  gl_Position = uMVPMatrix * aPosition;\n" +
        "  vColor = aColor;\n" +
        "}\n";

public final String fragmentShader =
        "precision mediump float;\n" +
        "varying vec4 vColor;\n" +
        "void main() {\n" +
        "  gl_FragColor = vColor;\n" +
        "}\n";
// ...
}

अगर इन सवालों में से कुछ गूंगे हैं, तो मैं पहले से माफी मांगता हूं, लेकिन मैंने पहले कभी भी शेडर्स के साथ काम नहीं किया है।

1) क्या उपरोक्त कोड शेडर्स (सार्वजनिक अंतिम वर्ग के गुणों) को परिभाषित करने का सामान्य तरीका है?
2) क्या मुझे एक अलग शेडर क्लास होना चाहिए?
3) यदि शादियों को उनके उपयोग करने वाले वर्ग के बाहर परिभाषित किया जाता है, तो मुझे उनकी विशेषताओं के नाम कैसे पता होंगे (उदाहरण के लिए "कोड में निम्नलिखित कोड") ताकि मैं उन्हें बाँध सकूं?

colorHandle = GLES20.glGetAttribLocation(program, "aColor");

जवाबों:


16

मैंने हमेशा शेड (एक स्ट्रिंग में) को परिभाषित करने के उस तरीके को नापसंद किया है। मैं एक पाठ फ़ाइल में मेरा करना पसंद करता हूं और लोड करते समय इसे पढ़ता हूं। इसे एक स्ट्रिंग में परिभाषित करना डिबगिंग के लिए कष्टप्रद है और यह मुझे गन्दा लगता है। यह सिर्फ इतना आसान है कि इसे टाइप करने में सक्षम है और इसे ऐसे स्वरूपित करें जैसे कि यह एक स्ट्रिंग के अंदर होना चाहिए।

मेरे पास एक अलग वर्ग है जिसमें सामान्य shader कार्यक्षमता है, जैसे shaders में पढ़ना और shader डीबगिंग के लिए लॉगिंग जानकारी प्रिंट करना।

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

हालाँकि, अंत में यह आपके ऊपर है। जिस तरह से आप वर्तमान में कर रहे हैं यह बहुत अच्छा काम करता है, अगर यह आपको किसी भी परेशानी का कारण नहीं बना रहा है।


2
अलग-अलग फ़ाइलों में आपके शेड्स होने का अर्थ यह भी है कि आप अपने काम में काम आने वाले शेडर संपादकों का उपयोग कर सकते हैं और पूर्ण वाक्य-विन्यास हाइलाइटिंग कर सकते हैं, और यहां तक ​​कि आपके प्रोग्राम में उनका परीक्षण करने से पहले उनका पूर्वावलोकन कर सकते हैं, यदि आपका समर्थन करता है।
रेसिमजेशन

6
एक स्ट्रिंग में shaders होने का एकमात्र वास्तविक कारण त्वरित परीक्षणों और ट्यूटोरियल के लिए है .. जहाँ फ़ाइल हैंडलिंग "अनावश्यक कोड" का थोक जोड़ता है।
जरी कोमप्पा

2
आप shader फ़ाइलों पर हॉट-रीलोड भी लागू कर सकते हैं - आपको गेम को फिर से लॉन्च किए बिना परिवर्तनों को डीबग करने की अनुमति देता है। उत्पादकता ++
लायसन

मुझे उन्हें पढ़ने का एक फाइल बनाने और एक अलग शेडर क्लास रखने का विचार पसंद है। उन्हें हमेशा एक स्ट्रिंग में देखना मुझे भ्रमित कर रहा था क्योंकि मुझे नहीं पता था कि क्या वह ऐसा तरीका है जिसे वे आमतौर पर परिभाषित करते हैं या सिर्फ सीखने के उद्देश्य के लिए। धन्यवाद!
मिविकलिन

8

Shader (और इस प्रकार सामग्री) प्रबंधन एक कठिन समस्या है जिसे आप तब चलाते हैं जब आपका ग्राफिक्स सिस्टम अधिक जटिल हो जाता है और आप नोटिस करते हैं कि हार्डर कोडिंग हर शडर बड़े पैमाने पर कोड डुप्लीकेशन में ले जाएगा। इसे हल करने के कुछ वैकल्पिक तरीके यहां दिए गए हैं:

  • छोटे उदाहरण हैं जहां केवल कुछ जोड़े हैं जो हार्ड को-कोड करते हैं ताकि वे फ़ाइल हैंडलिंग से बचने के लिए तार के रूप में काम कर सकें क्योंकि जरी कोप्पा ने टिप्पणी की
  • बेहतर यह है कि आप अलग-अलग फ़ाइलों का उपयोग करें जहाँ आपके पास सिंटैक्स हाइलाइटिंग और उचित स्वरूपण हो सकता है। आप एक साधारण डिबग सिस्टम को भी कोड कर सकते हैं जो उन फ़ाइलों में परिवर्तन देखता है और आपके गेम के चलने के दौरान संशोधित शेयर्ड को मक्खी पर लागू करता है।
  • जब सामग्री की संख्या बढ़ जाती है, तो एक shader जनरेटर लगभग एक आवश्यकता बन जाता है। मूल रूप से आप "टुकड़े टुकड़े करने वाले सामान्य मैपिंग स्निपेट" जैसे सामान्य स्निपेट्स को परिभाषित करते हैं और वांछित घटकों को शामिल करके अपने पूर्ण शेड्स की रचना करते हैं।
    • आप हार्ड-कोडेड स्ट्रिंग स्निपेट्स का उपयोग कर सकते हैं, लेकिन यह वास्तव में तेजी से गड़बड़ हो जाता है, इसलिए एक बार फिर फाइलें एक अच्छा विचार है।
    • आपके पास अलग-अलग फ़ाइलों (या समान) में कोड के बिट्स हो सकते हैं या वैकल्पिक रूप से ubershader / supershader का उपयोग कर सकते हैं जहां आप सामान को सक्षम / अक्षम करने के लिए प्रीप्रोसेसर (या समान ध्वज) का उपयोग करते हैं।

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


मैं अपने शेड्स को निश्चित रूप से एक अलग फ़ाइल में स्थानांतरित करूंगा। धन्यवाद!
मिविकलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.