حدد خارجيًا وحدات الماكرو قبل المعالج في GLSL

StackOverflow https://stackoverflow.com/questions/2378448

  •  24-09-2019
  •  | 
  •  

سؤال

GLSL لديه معالج preprocess على الطراز C الكامل. الشيء الوحيد الذي لا يعمل هو #include. تتمثل إحدى الميزات الرائعة في أنه يمكنك استخدام #ifdef للتعليق على الوظائف وبالتالي إنشاء تظليل واحد يمكن تخفيفه إذا لم يتم استخدام ميزات معينة.

سؤالي هو:

هل هناك طريقة لتحديد ماكرو من رمز C؟

لا يبدو أن هناك طريقة للقيام بذلك مع واجهة OpenGL. يتمثل الاختراق السريع في تقديم بضعة أسطر مع #Define FOO قبل ملف النموذج الذي تم تحميله من الكود. ولكن يبدو نوعا من الوراء.

هل كانت مفيدة؟

المحلول

لا تحتاج حقًا إلى تقديمه إلى الرمز الذي قمت بتحميله. لهذا السبب توجد سلاسل متعددة في واجهة برمجة تطبيقات glshadersourcearb.

شيء مثل ما يلي يفعل ما تبحث عنه:

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

نصائح أخرى

هذا ما أستخدمه لتجنب #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");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top