2011-09-24 26 views
14

मैं ओपनजीएल में शेडर्स के उदाहरणों की खोज कर रहा हूं और मैंने कुछ अलग-अलग शैलियों को देखा है। कुछ शेडर्स विशेष रूप से अंतर्निहित प्रकारों (यानी gl_Vertex) का उपयोग करते हैं ताकि डेटा कोड और शेडर से डेटा स्थानांतरित किया जा सके।ओपनजीएल ईएस 2.0 शेडर सर्वोत्तम प्रथाओं

कुछ शेडर्स gl_Position और gl_FragColor के बजाय वर्टेक्स से खंड शेडर में डेटा स्थानांतरित करने के लिए विभिन्न प्रकारों का उपयोग करते हैं।

कुछ shaders और 'बाहर' 'में' उपसर्ग का उपयोग आंकड़ा अंतरण निर्दिष्ट करने के लिए:

in vec3 vertex; 

void main() { 
    gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0); 
} 

... जबकि दूसरों को विशेषताओं का उपयोग:

attribute vec4 vertex_attrib; 
attribute vec4 tex_coord_attrib; 
attribute vec4 color_attrib; 
uniform mat4 mvp_matrix; 
uniform mat4 texture_matrix; 
varying vec4 frag_color; 
varying vec2 tex_coord; 

void main(void) 
{ 
    gl_Position = mvp_matrix * vertex_attrib; 
    vec4 transformed_tex_coord = texture_matrix * tex_coord_attrib; 
    tex_coord = transformed_tex_coord.st/transformed_tex_coord.q; 
    frag_color = color_attrib; 
} 

मेरा प्रश्न है, क्या है शेडर्स लिखने के लिए जीएलएस 2.0 में पसंदीदा तरीका? क्या कोई सर्वोत्तम अभ्यास मार्गदर्शिका है? क्या कोई कशेरुक & खंड का शेडर का उदाहरण प्रदान कर सकता है जो 'क्या करना है' का एक चमकदार उदाहरण है ??

धन्यवाद।

उत्तर

21
  1. "ES 2.0" में कोई gl_Vertex नहीं है। आपके द्वारा प्रदान किए गए सभी गुण कस्टम हैं।
  2. gl_Position ES 2 में एक विकल्प नहीं है लेकिन एक आवश्यकता है। क्यों समझने के लिए ओपनजीएल पाइपलाइन के बारे में जानें। संकेत: यह केवल तभी वैकल्पिक हो सकता है जब रास्टरराइज़र अक्षम हो (उदाहरण के लिए फीडबैक ट्रांसफॉर्म करें) लेकिन यह ईएस में समर्थित नहीं है।
  3. ईएस 2.0 वर्टेक्स विशेषताओं में 'विशेषता' मान होना चाहिए और भिन्नताओं को 'भिन्न' के रूप में घोषित किया जाना चाहिए। इसके बजाय 'इन' और 'आउट' का उपयोग ओपनजीएल 3+ के तहत विकसित एक आदत है और इसे ईएस पर लागू नहीं किया जा सकता है।

अंत में, आपके लिए सबसे अच्छा विकल्प निकोल बोलस द्वारा सुझाए गए अनुसार OpenGL ES 2.0 Specification पढ़ना होगा। पहले नियम, सर्वोत्तम प्रथाओं - बाद में। सौभाग्य!

+0

'इन' और 'आउट' मैक्रोज़ से थोड़ी मदद के साथ लागू किया जा सकता है। – user1095108

22

आपकी सबसे बड़ी समस्या यह है कि आप डेस्कटॉप जीएलएसएल शेडर्स को देख रहे हैं और यह पता लगाने की कोशिश कर रहे हैं कि जीएलएसएल-ईएस के लिए इसका क्या अर्थ है।

ओपनजीएल ईएस ओपनजीएल जैसी ही बात नहीं है, जीएलएसएल-ईएस जीएलएसएल जैसी ही बात नहीं है। जीएलएसएल-ईएस अलग होने के बाद जीएलएसएल ने कई सालों में काफी प्रगति की है। इसलिए, आप डेस्कटॉप जीएलएसएल शेडर्स का उपयोग जीएलएसएल-ईएस शेडर्स को लागू करने के लिए किसी न किसी तरह की मार्गदर्शिका के अलावा कुछ भी नहीं कर सकते हैं। आप सी ++ ग्रंथों का उपयोग सी

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

मुझे जीएलएसएल-ईएस के मार्गदर्शिकाओं के बारे में बहुत कुछ पता नहीं है, लेकिन खोजने और उपयोग करने का सबसे आसान स्रोत अंतिम स्रोत है: The OpenGL ES Shading Language Specification (PDF)। एक्सटेंशन कार्यक्षमता पर ढेर कर सकते हैं, लेकिन वह पीडीएफ मूल भाषा को परिभाषित करता है। आपकी अगली शर्त ओपनजीएल ईएस 2.0 विशिष्ट के रूप में स्पष्ट रूप से चिह्नित कोई भी सामग्री होगी।

असल में, जब आप समझ सकते हैं कि एक डेस्कटॉप जीएलएसएल शेडर क्या कर रहा है, तो एल्गोरिदम को देखना सबसे अच्छा है, सिंटैक्स नहीं, अगर आप ओपनजीएल ईएस 2.0 एप्लिकेशन लिख रहे हैं।

+2

मैं मंच पर नहीं कर रहा हूँ जहाँ मैं एल्गोरिदम को देख रहा हूँ। मैं बस एक जीएलएसएल_ईएस शेडर के सामान्य वाक्यविन्यास को समझने की कोशिश कर रहा हूं। उदाहरण के लिए, यदि किसी के पास कोई है, तो आदर्श होगा क्योंकि पीडीएफ में पृष्ठों के माध्यम से व्यावहारिक रूप से सीखना आसान है। क्या किसी के पास कोई है? – MarkP

+3

मुझे आमतौर पर उदाहरण पसंद हैं पूर्ण चश्मे से भी ज्यादा, लेकिन थ्रू पढ़ना gh कि विशेष पीडीएफ मेरे लिए बेहद रोशनी था, और मैं निश्चित रूप से भी इसकी सिफारिश करता हूं। –

2

एंड्रॉइड डेवलपर ओपनजीएल ईएस 2.0 ट्यूटोरियल में और एसडीके नमूना कोड में ओपनजीएल ईएस 2.0 के लिए नमूना कोड है। लेकिन आपको अभी भी वही संदर्भ फ़ाइल की आवश्यकता होगी जो लोग उल्लेख करते रहें: ओपनजीएल ईएस छायांकन भाषा विशिष्टता "नमूना कोड को समझने के लिए, क्योंकि Google अक्सर यह नहीं बताता कि वे क्या कर रहे हैं। और जब वे करते हैं, तो वे हमेशा छड़ी नहीं रहते मानक ओपन शब्दावली के लिए।

कहा, आप इसे आसान http://www.khronos.org/opengles/sdk/docs/man/ पर ओपन ES 2.0 संदर्भ पृष्ठों का उल्लेख करने के कोड को पढ़ने के दौरान मिल सकता है।

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