2013-02-27 208 views
6

में उन्हें सही तरीके से उपयोग कैसे करें मैं एक गेम इंजन पर काम कर रहा हूं और यह काफी विकसित हुआ है। चूंकि इंजन को मैक पर भी काम करने की ज़रूरत है, मैं अभी भी ओपनजीएल 3.2 और जीएलएसएल 1.2 का उपयोग कर रहा हूं :-( मैं जीएलईडब्लू का उपयोग करता हूं जो मुझे लगता है कि मेरे लिए विस्तार के मुद्दों को हल करेगा।ओपनजीएल एक्सटेंशन, सी और glsl

संपादित करें: इस बीच, प्रश्न का हिस्सा है जवाब - बगल में स्थित संपादित पर पर पढ़ें:

मैं हमेशा shaders विंडोज और मैक दोनों पर काम करने के लिए सक्षम था, कभी कभी मैं #extension GL_EXT_gpu_shader4 तरह GLSL कोड में एक पंक्ति जोड़ना होगा: इसे बनाने के लिए सक्षम मैक पर काम करें। ऐसा लगता है कि मेरा विंडोज संस्करण एक ही शेडर को संकलित करते समय चेतावनी देगा, लेकिन यह काम करेगा।

लेकिन तब से मैंने ज्यामिति शेडर्स का उपयोग शुरू किया, मेरा दुःस्वप्न शुरू हो गया है। किसी कारण से, मैक मुझे #extension GL_EXT_gpu_shader4 का उपयोग करने की अपेक्षा करता है: सक्षम करें जबकि विंडोज़ मुझे #extension GL_EXT_geometry_shader4 का उपयोग करने की अपेक्षा करता है: सक्षम करें। यह एक मंच स्वतंत्र शेडर बनाने के लिए यह कम स्पष्ट बनाता है।

इसके अलावा, और यह और भी अधिक कष्टप्रद है: Windows संस्करण मुझे उपयोग करना चाहता है: glTransformFeedbackVaryings और मुझे लगता है कि होता है कि Glew इसे करने के लिए मैक उपलब्ध बनाने हैं लेकिन वहाँ मैं स्पष्ट रूप से glTransformFeedbackVaryingsEXT उपयोग करने की आवश्यकता जो नहीं होगा विंडोज संस्करण पर काम करते हैं। तो मुझे आवश्यकतानुसार उपयोग करने के लिए APPLE के लिए #ifdef की आवश्यकता है। glBeginTransformFeedback और glBeginTransformFeedbackEXT के साथ समान समस्या।

लेकिन दोनों glProgramParameteriEXT स्वीकार करते हैं, वहाँ मैं distiction की जरूरत नहीं है ...

मैं समझता हूँ कि यह केवल बदलने राय है कि मैं इस समस्या हो रहा है के साथ है, लेकिन ... क्या यह सब है के बारे में?

मैंने सोचा कि मुझे समझ में आया कि ओपनजीएल एक्सटेंशन कैसे काम करते थे, लेकिन मैं उस समझ को खोना शुरू कर रहा हूं।

यह एक बिंदु पर जा रहा है जहां मुझे लगता है कि जब मैं किसी अन्य विंडोज सिस्टम या किसी अन्य मैक सिस्टम या किसी अन्य लिनक्स सिस्टम पर कोड चलाता हूं, तो मुझे नई समस्याएं होती हैं क्योंकि विभिन्न ग्राफिक्स एडेप्टर या कुछ हैं।

क्या कोई इसे समझने में मेरी सहायता कर सकता है? मैंने एक्सटेंशन के बारे में ओपनजीएल मैनुअल पढ़ा है, इसलिए मुझे कुछ स्पष्ट याद आ रही है। मैं कैसे सुनिश्चित कर सकता हूं कि मेरा कोड हमेशा काम करेगा?

संपादित करें: मैक संस्करण से पूरी तरह से Glew को दूर करने और पूरी तरह से मैक के लिए अपने ओपन 3.2 कार्यान्वयन का उपयोग करके, सभी namings सामान्य हैं और मैं पूरी तरह निकाल सकता #extension GL_EXT_gpu_shader4: मेरे shaders से सक्षम करें। एकमात्र चीज जो मुझे अब चिंता करती है वह है कि ज्यामिति शेडर्स के लिए, मुझे फ़ंक्शन glProgramParameteri की आवश्यकता है जो मौजूद नहीं है, लेकिन glProgramParameteriEXT करता है। किसी कारण से, यह फ़ंक्शन विंडोज पर भी काम करता है। क्यूं कर? क्या मैं निश्चित हो सकता हूं कि यह सभी सिस्टम/हार्डवेयर पर काम करेगा?

+0

एप्पल आमतौर पर है थोड़ा पीछे, तो आप केवल आधिकारिक समर्थित संस्करण की जांच कर सकते हैं। [यह] (http://stackoverflow.com/questions/15101939/glsl-vertex-shader-crashes-computer) आपके प्रश्न से ठीक पहले पोस्ट किया गया था। –

+0

एचएम, मुझे नहीं लगता कि पोस्ट मेरी मदद करता है। मैं ओएसएक्स शेर 10.7.5 पर विकास कर रहा हूं और यह एक एएमडी ग्राफिक्स एडाप्टर है। लेकिन अगर मैं आपको सही ढंग से समझता हूं, तो समस्याएं ऐप्पल के खराब कार्यान्वयन से संबंधित हैं? भाप पर उन सभी खेलों को कैसे पोर्ट किया और काम करते हैं? – scippie

+0

मैकोज़क्स पर उपलब्ध मूल ओपनजीएल 3.2 का उपयोग क्यों नहीं कर रहे हैं। –

उत्तर

3

EXT का अर्थ है कि आप ज्यामिति शेडर के लिए एक एक्सटेंशन का उपयोग कर रहे हैं। यह विंडोज़ पर भी काम करना चाहिए। ओपनजीएल 3 में ज्यामिति शेडर कोर कार्यक्षमता होना चाहिए।2, लेकिन अभी आप विस्तार का उपयोग कर रहे हैं (मूल रूप से आप पुराने ओपनजीएल संस्करणों की कार्यक्षमता का उपयोग कर रहे हैं वास्तविक 3.2 नहीं)। कोर ज्यामिति शेडर का उपयोग करने के लिए आपको जीएलएसएल 1.5 पर स्विच करना होगा।

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

+0

धन्यवाद, यह एक बहुत ही रोचक जवाब है। मैं इसे अवशोषित करूँगा और यह पता लगाने के लिए कुछ समय लेगा कि क्या यह पूरी तरह से मेरे प्रश्न का उत्तर देता है। – scippie

+0

आप सही हैं कि glProgramParameteri() को कोर कार्यक्षमता में अब आवश्यक नहीं है। वहां वे पैरामीटर शेडर कोड के अंदर ही सेट हैं। – scippie

+0

और मुझे लगता है कि आपने मेरे प्रश्न का पूरी तरह उत्तर दिया है। मैं इसे सही उत्तर के रूप में चिह्नित करूंगा। – scippie

2

यदि आप ओपनजीएल/जीएलएसएल संस्करणों से मेल खाते हैं तो आपका जीवन आसान होगा।

http://en.wikipedia.org/wiki/OpenGL_Shading_Language

पिक से:

  • ओपन 2.1, GLSL के साथ 120 + GL_EXT_gpu_shader4 + GL_EXT_geometry_shader4
  • ओपन 3.2, GLSL साथ 150
  • ओपन 3.3, GLSL साथ 330

यदि आप ओपनजीएल 3.2 का उपयोग कर पहले से ही खुश हैं, तो जीएलएसएल 1 तक जाएं 50, क्योंकि यह आधुनिक जीएलएसएल 330+ के करीब है। यदि आप सबसे अधिक अनुकूलता चाहते हैं, तो ओपनजीएल 2.1, जीएलएसएल 120, प्लस ज्यामिति शेडर एक्सटेंशन का उपयोग करें। (हालांकि मुझे यकीन नहीं है कि यह आपको कितनी संगतता खरीदता है)

केवल जीएलएसएल 120 प्लस एक्सटेंशन का उपयोग करते समय, आपको ज्यामित्री शेडर को आदिम प्रकार में बाहर/बाहर निर्दिष्ट करने के लिए glProgramParameteriEXT() का उपयोग करने की आवश्यकता है, और वर्टेक्स गिनती। उदाहरण के लिए:

glUseProgram(prog); 
glProgramParameteriEXT(prog, GL_GEOMETRY_INPUT_TYPE_EXT, GL_TRIANGLES); 
glProgramParameteriEXT(prog, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLE_STRIP); 
glProgramParameteriEXT(prog, GL_GEOMETRY_VERTICES_OUT_EXT, max_output_verticies); 

https://wiki.engr.illinois.edu/display/graphics/Geometry+Shader+Hello+World

ओपन 3.2, GLSL 150 में, आप इस जानकारी को आपकी शेडर में निर्दिष्ट करते हैं, जैसे एक घोषणा का उपयोग कर:

#version 150 
layout (triangles) in; 
layout (triangle_strip, max_vertices = 3) out; 

http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/geometry-shader/

+0

खैर डेविड, धन्यवाद, और मैं इस पर पूरी तरह से सहमत हूं, लेकिन यह बात है: जब मैक के साथ संगत होने के लिए अपने शेडर्स बनाने की कोशिश करता हूं, तो मुझे 120 + एक्सटेंशन का उपयोग करना होगा। यह ठीक काम करता है, लेकिन यह मेरे डेस्कटॉप पीसी पर काम नहीं करेगा जहां एनवीडिया ड्राइवर एक्सटेंशन लाइन पर असफल होने में विफल रहेगा। इस समय मैंने मैक समर्थन को अभी हटा दिया है, मैं हमेशा बाद में मैक के लिए अतिरिक्त कोड लिख सकता हूं। यह सिर्फ मुझे वापस पकड़ रहा है। मैं 3 से बहुत खुश हूँ।3 + 330 अब। – scippie