2012-07-11 18 views
5

मैं ओपनजीएल ईएस और ओपनजीएल (विंडोज) के लिए एक ही शेडर स्रोत रखना चाहता हूं। ऐसा करने के लिए मैं कस्टम डेटा प्रकारों को परिभाषित करना चाहता हूं और केवल OpenGL ES फ़ंक्शंस का उपयोग करना चाहता हूं।ओपनजीएल ईएस और ओपनजीएल संगत शेडर्स

#define highp 
#define mediump 
#define lowp 
विंडोज शेडर के लिए

और शेडर लिखने के रूप में यह OpenGL ES के लिए है:

एक दृष्टिकोण को परिभाषित करने के लिए है।

अन्य दृष्टिकोण OpenGL ES के लिए इस तरह कस्टम डेटा प्रकार को परिभाषित करने के लिए है:

#define hvec2 highp vec2 

और Windows

#define hvec2 vec2 

के लिए इस तरह आपको क्या लगता है बेहतर है? क्या आपके पास इस समस्या के लिए अन्य समाधान हैं?

उत्तर

4

मेरे समाधान शेडर कोड है कि दोनों एपीआई के साथ संगत है, और फिर जब OpenGL ES करने के लिए टुकड़ा शेडर स्रोत कोड को अपलोड सिर्फ निम्न पंक्ति पहले जोड़ें लिखने के लिए कर दिया गया है:

precision mediump float; 

डिफ़ॉल्ट सेट यही कारण है कि माध्यम के लिए तैरने बिंदु सटीक। ओपनजीएल ईएस खंड टुकड़े में फ्लोटिंग पॉइंट मानों के लिए कोई डिफ़ॉल्ट सटीक स्तर नहीं है, जिसका अर्थ है कि आपको या तो प्रत्येक फ़्लोटिंग पॉइंट घोषणा पर सटीकता निर्दिष्ट करने की आवश्यकता है, या स्पष्ट रूप से डिफ़ॉल्ट परिशुद्धता सेट करें। यदि आप अपने आवेदन के लिए अधिक समझदारी करते हैं तो आप lowp या highp का उपयोग कर सकते हैं। http://www.khronos.org/files/opengles_shading_language.pdf

आप भी अपनी #define दृष्टिकोण के साथ इस दृष्टिकोण मिश्रण आप अपने shaders में परिशुद्धता पर बेहतर नियंत्रण की जरूरत है हो सकता है:

अधिक जानकारी के लिए OpenGL ES शेडिंग भाषा विनिर्देश की धारा 4.5.3 देखें।

4

आप http://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt

इस्तेमाल कर सकते हैं इस विस्तार के ओपन ES 2.0 की सुविधाओं है कि ओपन 3.x. से याद कर रहे हैं के लिए समर्थन जोड़ता इन सुविधाओं को सक्षम करने से ओपनजीएल ईएस 2.0 से ओपनजीएल तक अनुप्रयोगों को पोर्ट करने की प्रक्रिया कम हो जाएगी।

+0

क्या कोई जानता है कि यह कैसे काम करता है? मैंने spec के माध्यम से स्किम किया है लेकिन जीएलएसएल ईएस (संस्करण 100) और जीएलएसएल (संस्करण 150) कैसे संगत होगा उससे संबंधित कुछ भी नहीं मिला। –

+0

भविष्य के संदर्भ के लिए मैंने पाया कि ES2_compatibility के तहत एक OpenGL 3.2> संदर्भ शीर्ष पर #version 100 के साथ ES 2.0 शेडर्स लोड कर सकता है। –

1

मैं बस पर प्रत्येक शेडर का चलना शुरू हो जाए शेडर खिड़कियों पर चलाता निम्नलिखित को परिभाषित करते हुए यह कामयाब रहे:

#define lowp 
#define mediump 
#define highp 

अतिरिक्त मैं शेडर जानकारी जो plattform प्रयोग किया जाता है देना (विंडोज, मोबाइल, आईओएस) जिसका उपयोग इस तरह किया जा सकता है:

#ifdef WINDOWS 
precision mediump float; 
#endif 
+0

टिप्पणी के शीर्ष भाग के लिए टेम्पर्ड अपवोट - मुझे लगता है कि परिशुद्धता संशोधक के लिए यह अधिक मूल्यवान है और उन्हें अप्रासंगिक प्लेटफ़ॉर्म पर छोड़कर उन्हें शामिल करने और कहीं और प्रदर्शन प्रदर्शन पर होने के बजाय उन्हें छोड़ना अधिक मूल्यवान है। लेकिन '#ifdef GL_ES' (और '# ifndef') सशर्त रूप से संकलित करने का सबसे आसान तरीका है, जिसमें बनाया जा रहा है। – Tommy

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