Afaik, нет способа сделать это динамически в обработке.Тем не менее, вы можете отдельно скомпилировать ваши шейдеры с помощью glslify
, который является системой включения GLSL во время компиляции.
glslify
(https://github.com/glslify/glslify) - это немного излишне. Всякий раз, когда я делаюприложение OpenGL / GLSL, я запускаю свою собственную систему. Примерно так (взято из моего клона OpenGL Java Minecraft здесь ):
private static String process(String code){
String[]lines=code.split("\n");
for(int i=0;i<lines.length;i++){
if(lines[i].startsWith("#include : ")){
lines[i]=process(Utils.loadFile("path_to_include_directory/"+lines[i].replace("#include : ","")+".glsl"));
}
}
StringBuilder str= new StringBuilder();
for(String s:lines){
str.append(s).append("\n");
}
return str.toString();
}
Этот код выполняет копирование-вставку, включая:.Использование:
///// MAIN FILE
#include : bar_module
float foo(vec3 p){
return bar(p * 5.0);
}
///// path_to_include_directory/bar_module.glsl
float bar(vec3 p) {
/* ... ... */
}
Это рекурсивный включающий механизм, достаточно эффективный во время выполнения. Статическая компиляция не требуется! Единственный недостаток в том, что циклические зависимости не обнаруживаются. Но вы не должнывсе равно быть в ситуации с циклическими зависимостями:)
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ Я на самом деле не помню, как это работает, но я думаю, что это общая идея:
File file=new File("my_shader.vert");
file.setContents(process(file.readContents()));
PShader my_shader=new PShader("my_shader");
ПРИМЕЧАНИЕ: setContents
и readContents
на самом деле не существует, но вы поняли:)
PS Utils.loadFile возвращает содержимое имени файла, переданного в виде строки.