2014-06-25 20 views
8

के बजाय कस्टम आउटपुट विशेषता का उपयोग करना मैं वर्तमान में शेडर्स (3.3) के साथ ओपनजीएल सीख रहा हूं। एक ऐसी चीज है जिसे मैं काम नहीं कर सकता। मैंने पढ़ा है कि gl_Position और gl_FragCoords जैसे अंतर्निर्मित चर का उपयोग ओपनजीएल 3+ में बहिष्कृत किया गया है, इसलिए मैं अपने आउटपुट चर का उपयोग करना चाहता था।जीएलएसएल - gl_Position

बजाय इस की:

#version 330\n 
layout(location=0) in vec2 i_position; 
out vec4 o_position; 
void main() 
{ 
    gl_Position = vec4(i_position, 0.0, 1.0); 
}; 

मैंने लिखा इस:

#version 330\n 
layout(location=0) in vec2 i_position; 
out vec4 o_position; 
void main() 
{ 
    o_position = vec4(i_position, 0.0, 1.0); 
}; 

shaders दोनों ही मामलों में समस्याओं के बिना संकलन है, लेकिन दूसरा कोड सिर्फ खाली स्क्रीन पैदा करता है। क्या मुझे किसी भी तरह से निर्दिष्ट करने की आवश्यकता है कि आउटपुट एक चर है?

+4

इनमें से कोई भी [अंतर्निर्मित चर] (http://www.opengl.org/wiki/Built-in_Variable_ (GLSL)) बहिष्कृत हैं। कोर प्रोफाइल (संगतता प्रोफाइल) से पहले, ऐसे अंतर्निहित थे जो निश्चित पाइपलाइन विशेषताओं को प्रतिबिंबित करते थे, जैसे 'gl_Color',' gl_Normal', आदि –

+0

ओह मुझे खेद है। मैंने पढ़ा है कि कुछ 'gl_ * 'चर को बहिष्कृत कर दिया गया था और सोचा था कि वे सभी थे। स्पष्टीकरण के लिए धन्यवाद। वैसे भी, मैं इसे कस्टम आउटपुट वैरिएबल के साथ कैसे काम करूं? या आप वर्टेक्स स्थिति सेट करने के लिए बस gl_Position विशेषता का उपयोग करते हैं? – michy04

+2

आपको अभी भी 'gl_Position' का उपयोग करना होगा। वह चर विशेष है, क्योंकि यह निर्देशांक निर्दिष्ट करता है जो वर्टेक्स और खंड शेडर्स (क्लिपिंग, रास्टरराइजेशन इत्यादि) के बीच फिक्स्ड फ़ंक्शन ब्लॉक द्वारा उपयोग किए जाते हैं। आप इसे एक चर के साथ प्रतिस्थापित नहीं कर सकते जिसे आप परिभाषित करते हैं। उदाहरण के अलावा @ ब्रेटहेल ने पहले से ही उल्लेख किया है, 'gl_FragColor', जो कि ** खंड ** शेडर के पूर्व-निर्धारित आउटपुट के रूप में उपयोग किया जाता है, को भी बहिष्कृत किया जाता है। –

उत्तर

26

यह ज्यादातर टिप्पणियों द्वारा कवर किया गया था, लेकिन जगह में उत्तर देने के हित में, मुझे संक्षेप में बताएं कि कौन से पूर्व परिभाषित जीएलएसएल चर कोर प्रोफाइल में चले गए हैं, और जो अभी भी वहां हैं।

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

  • फिक्स्ड समारोह परिवर्तन राज्य (gl_ModelViewMatrix, gl_ProjectionMatrix, आदि)।
  • प्रकाश पैरामीटर (gl_Light*)।
  • सामग्री पैरामीटर (gl_Material*)।
  • क्लिप विमान (gl_Clip*)।

इसी तरह, निश्चित फ़ंक्शन वर्टेक्स विशेषताओं को प्राप्त करने वाले वर्टेक्स शेडर इनपुट इसलिए चले गए हैं क्योंकि केवल सामान्य विशेषता कोर प्रोफ़ाइल में समर्थित हैं। इनमें शामिल हैं gl_Vertex, gl_Normal, gl_Color, आदि

वहाँ

भी कुछ पूर्व निर्धारित varying चर gl_FrontColor, gl_BackColor, और gl_TexCoord कि सभी चले गए हैं की तरह हुआ करता था, और आसानी से अपने खुद out/in चर को परिभाषित करते हुए बदला जा सकता है ।

भी पूर्व परिभाषित खंड शेडर आउटपुट gl_FragColor और gl_FragData हैं। वे एक दिलचस्प मामला हैं क्योंकि कारण फीचर बहिष्कार नहीं है। मेरी समझ यह है कि उन्हें बहिष्कृत कर दिया गया क्योंकि वे वर्तमान कार्यक्षमता को समायोजित करने के लिए पर्याप्त लचीला नहीं थे। चूंकि gl_FragColor का प्रकार vec4 था, इसलिए टुकड़े के टुकड़े के आउटपुट को फ्लोट घटकों के साथ वैक्टर होना होगा। यदि आपके रेंडर लक्ष्य का एक अलग प्रकार है, तो यह ठीक से काम नहीं करता है, उदा। यदि आप एक पूर्णांक बनावट में प्रतिपादन कर रहे हैं।

तो क्या पूर्व परिभाषित चर अभी भी बाकी हैं? पहले से बहुत कम, अभी भी कुछ हैं, जो सभी निश्चित फ़ंक्शन से संबंधित हैं जो अभी भी प्रोग्राम करने योग्य पाइपलाइन में मौजूद हैं। उदाहरणों में शामिल हैं:

  • शिखर समन्वय शिखर शेडर और टुकड़ा शेडर, जो मुख्य रूप से शीर्ष शेडर में gl_Position उत्पादन और टुकड़ा शेडर में gl_FragCoord इनपुट के होते हैं के बीच इंटरफेस।क्लिपिंग और रास्टरराइजेशन जैसे वर्टेक्स और खंड शेडर्स के बीच बैठे कई निश्चित फ़ंक्शन ब्लॉक अभी भी हैं। वे निश्चित फ़ंक्शन ब्लॉक वर्टेक्स निर्देशांक पर काम करते हैं, इसलिए पूर्व-परिभाषित चर अभी भी समझ में आते हैं।
  • इंस्टेंसिंग से संबंधित कुछ चर (gl_VertexID, gl_InstanceID)।
  • gl_ClipDistance मनमाने ढंग से विमानों के साथ क्लिपिंग का समर्थन करने के लिए, जो अभी भी निश्चित फ़ंक्शन फॉर्म में मौजूद है।
  • gl_FrontFacing। त्रिभुज के घुमावदार क्रम का निर्धारण निश्चित कार्य द्वारा किया जाता है, और टुकड़े के टुकड़े के लिए उपलब्ध कराया जाता है।

इनमें से कोई भी सूची संपूर्ण नहीं है, लेकिन मुझे उम्मीद है कि यह एक उपयोगी अवलोकन है, और कुछ पृष्ठभूमि प्रदान करता है। हमेशा की तरह, spec दस्तावेज़ अंतिम और पूर्ण उत्तर प्रदान करते हैं।

+2

सभी को उनके उत्तरों के लिए धन्यवाद, उन्होंने वास्तव में मुझे बहुत स्पष्ट किया। ओपनजीएल काफी जटिल एपीआई है इसलिए पहले कई चीजें स्पष्ट नहीं हैं। – michy04

1

जैसा कि हमारे कॉलेग्यू ने कहा है, gl_Position को बहिष्कृत नहीं किया गया है। मैंने ओपनजीएल 4.3 के बारे में ओपनजीएल सुपरबिबल 6 वां संस्करण खरीदा है और पहले पेजों (पेज 18) पर इस फ़ंक्शन का उपयोग किया जा रहा है।

मैं केवल पुस्तक प्राप्त करने की सिफारिश कर सकता हूं। यह ओपनजीएल डिजाइन करने वाले लोगों द्वारा लिखा गया है और यह वास्तव में व्यावहारिक है।

मैं भी आपके जैसा खो गया था क्योंकि मैं इंटरनेट या स्टैकएक्सचेंज के माध्यम से सीखने की कोशिश कर रहा था, और मुझे यह पुस्तक मिलने के बाद ओपनजीएल के साथ एक शानदार समय है। मुझे लगता है कि पुस्तक के साथ तीन हफ्तों में मैं जो सीखूंगा वह इंटरनेट से सीखने के 5 साल से अधिक मूल्यवान होगा। ओपनजीएल जटिल नहीं है और कोई भी "जानवर" नहीं है जितना लोग कहते हैं कि जब तक आप इसे इस पुस्तक से सीखते हैं। यदि आप इसे इंटरनेट पर सीखते हैं, तो मुझे यकीन है कि यह एक जानवर से अधिक है!

यह पुस्तक सही शुरुआत में कहती है कि वह कुछ भी नहीं सिखा रहा है जो कोर ओपनजीएल नहीं है, इसलिए आप सुनिश्चित कर सकते हैं कि आपके द्वारा किए गए जैसे जाल में भाग न लें।

आप इस पुस्तक को अमेज़ॅन में 50 सेंट के रूप में सस्ते में खरीद सकते हैं। मैं केवल इसकी सिफारिश कर सकता हूँ!

+0

क्या आपने इस प्रश्न का उत्तर देने की कोशिश की है? – Qwertiy

+1

मुझे लगता है कि उसने किया, अगर पहली वाक्य।और फिर पुष्टि की कि मुझे क्या संदेह है, इंटरनेट ओपनजीएल के shaderized संस्करणों के साथ क्या हो रहा है समझने के लिए एक पूर्ण संसाधन नहीं है। जो शर्म की बात है, क्योंकि ओपनजीएल में विकी है। –

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