2011-12-01 14 views
6

क्या कोई शेडर के लिए स्रोत कोड के भीतर बताने का कोई तरीका है कि शेडर को OpenGL ES के लिए संकलित किया जा रहा है? मैं #version प्रीप्रोसेसर निर्देश का उपयोग ओपनजीएल ईएस के लिए 100 होने के लिए संस्करण को परिभाषित करने में सक्षम होना चाहता हूं (ताकि शेडर ओपनजीएल ईएस 2.0 के लिए संकलित हो), लेकिन ओपनजीएल 2.1 के लिए संस्करण 110 है)।क्या यह बताना संभव है कि ओपनजीएल संस्करण शेडर कोड के भीतर ओपनजीएल ईएस है या नहीं?

#version को एक अलग स्ट्रिंग के रूप में रखने के लिए ऐसा करने का सबसे अच्छा तरीका है जो आवेदन स्तर पर खिलाया जाता है, या क्या शेडर के भीतर ऐसा करने का कोई तरीका है?

एक और उपयोगी, संबंधित चीज करने में सक्षम होने के लिए कुछ ऐसा कहना होगा #if version == 100 इस कोड को संकलित करें, else इस कोड को संकलित करें। क्या यह जीएलएसएल के भीतर संभव है?

धन्यवाद।

+1

क्या आप इसे अपने सी प्रोग्राम में नहीं ढूंढ पाएंगे, जहां आप शेडर लोड करते हैं और '#version 100' प्रीपेन्ड करते हैं यदि यह ओपनजीएल ईएस है और अन्यथा' #version 110 'है। मेरा मतलब है कि आपको किसी भी स्ट्रिंग के रूप में शेडर को ओपनजीएल पास करना होगा, तो सी – PeterT

+0

में वर्जन प्रोसेसिंग क्यों नहीं करें हाँ मैं सोच रहा था कि मुझे क्या करना है! –

उत्तर

5

मुख्य कार्यक्रम से #version तैयार करना क्योंकि उपर्युक्त टिप्पणी में पीटरट ने सुझाव दिया है कि केवल तरीका है जो काम करेगा। ऐसा करने में सक्षम होने के नाते (और -D कंपाइलर स्विच जैसे कुछ के बिना स्थिरांक को परिभाषित करने में सक्षम होना) glShaderSource के पीछे मुख्य उद्देश्य है char* के बजाय पॉइंटर्स की एक सरणी लेना।

जीएलएसएल विनिर्देश (अध्याय 3.3) की आवश्यकता है कि #version व्हाइटस्पेस और टिप्पणियों को छोड़कर शेडर स्रोत में पहली चीज़ हो।

इस प्रकार, के रूप में

#ifdef foo 
    #version 123 
#endif 

ऐसी कोई बात नहीं वैध है, और ऐसी कोई बात नहीं संकलन (जब तक शेडर संकलक ज्यादा अनुमोदक है, यानि कि टूट)।

आपके दूसरे प्रश्न के बारे में, सशर्त संकलन निश्चित रूप से काम करता है और जिस तरीके से आप करना चाहते हैं उसका उपयोग करना एक अच्छी बात है।

+0

बहुत बढ़िया - धन्यवाद! :) –

+0

केके तो मैंने ठीक से ऐसा करना शुरू कर दिया और ऐसा लगता है कि यह वास्तव में अच्छा काम करता है। एकमात्र चीज है कि मैंने सुझाव दिया है कि आप '#if संस्करण == 100' का उपयोग कर संस्करण की जांच करें, लेकिन इसके बजाय आपको अंतर्निहित मूल्य '__VERSION__' का उपयोग करना चाहिए, इसलिए यह होगा,' #if __VERSION__ == 100', उदाहरण के लिए । –

3

यह भी संबंधित है जानकारी:

http://blog.beuc.net/posts/OpenGL_ES_2.0_using_Android_NDK/

आप कर सकते हैं, उदाहरण के लिए:

#ifdef GL_ES 
    precision mediump float; 
#endif 

ओपन ES 2.0 कार्यान्वयन एक GL_ES मैक्रो shaders में पूर्वनिर्धारित के लिए आवश्यक हैं।

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