2010-03-04 18 views
19

में पूर्व में प्रीप्रोसेसर मैक्रोज़ को परिभाषित करें जीएलएसएल में एक पूर्ण सी-स्टाइल प्रीप्रोसेसर है। एकमात्र चीज जो काम नहीं करती है # शामिल है। महान सुविधाओं में से एक यह है कि आप कार्यों को टिप्पणी करने के लिए #ifdef का उपयोग कर सकते हैं और इस प्रकार एक शेडर बना सकते हैं जिसे कुछ विशेषताओं का उपयोग नहीं किया जाता है।जीएलएसएल

मेरा प्रश्न है:

वहाँ सी कोड से मैक्रो निर्धारित करने के लिए एक तरीका है?

ओपनजीएल इंटरफ़ेस के साथ ऐसा करने का कोई तरीका नहीं लगता है। त्वरित हैक कोड लोड फ़ाइल फ़ाइल से पहले # परिभाषित खाद्य के साथ कुछ लाइनों को प्रीपेड करना है। लेकिन यह पीछे की तरफ लगता है।

उत्तर

23

आपको इसे लोड किए गए कोड पर प्रीपेड करने की ज़रूरत नहीं है। यही कारण है कि glShaderSourceARB एपीआई में कई स्ट्रिंग हैं।

कुछ निम्नलिखित की तरह करता है कि आप क्या देख रहे हैं:

char *sources[2] = { "#define FOO\n", sourceFromFile }; 
glShaderSourceARB(shader, 2, sources, NULL); 
+4

यह एक वैध समाधान है, लेकिन स्रोत कोड तैयार करने से कहीं ज्यादा बेहतर नहीं है। – rioki

+2

अच्छी तरह से, यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। कुछ अतिरिक्त मेमोरी आवंटन और प्रतिलिपि को रोकने के लिए यह अच्छा है (यही कारण है कि मैं प्रीपेड समाधान हैकी पर विचार करता हूं)। आपको क्या बेहतर लगेगा, और क्यों? – Bahbar

+1

मैंने 'glDefine ("म्यू", "फू")' लाइनों के साथ और अधिक सोचा था ... लेकिन ऐसा लगता है कि मैंने चश्मे का सही ढंग से अध्ययन किया ... – rioki

6

यहाँ है कि मैं क्या #version समस्याओं से बचने के लिए करते हैं। यह जावा है, और perfo के लिए अनुकूलित नहीं है, लेकिन यह पूरी तरह से काम करता है:

// extract shader sourcecode from file 
StringBuilder shaderSource = Tools.readTextRessource(shaderSrcFile.url); 

// apply defined values 
int versionIndex = shaderSource.indexOf("#version"); 
if(versionIndex == -1) err("missing #version xxx in shader "+shaderSrcFile.name()); 
int defineInsertPoint = shaderSource.indexOf("\n", versionIndex)+1; 

for (int i = defined.size() - 1; i >= 0; --i) 
    shaderSource.insert(defineInsertPoint, "#define " + defined.get(i) + "\n"); 
संबंधित मुद्दे