Как модулировать шейдеры в Processing 3.x - PullRequest
1 голос
/ 05 июня 2019

Я бы хотел использовать одну и ту же шумовую функцию в различных файлах .glsl, не копируя и не вставляя код каждый раз.Какой способ обработки для достижения этой цели?

1 Ответ

0 голосов
/ 26 июня 2019

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 возвращает содержимое имени файла, переданного в виде строки.

...