如何在Processing 3.x中模块化着色器

时间:2019-06-05 15:15:57

标签: glsl processing shader fragment-shader vertex-shader

我想在各种function showDowntown() { var x = document.getElementById("Downtown"); if (x.style.display === "") { x.style.display = "block"; } else { x.style.display = ""; } } 文件中使用相同的噪波功能,而不必每次都复制和粘贴代码。 实现此目的的处理方式是什么?

1 个答案:

答案 0 :(得分:0)

Afaik,在处理中无法动态地做到这一点。但是,您可以使用glslify(这是GLSL编译时包含系统)单独编译着色器。

但是,

glslifyhttps://github.com/glslify/glslify)有点过分。每当我创建OpenGL / GLSL应用程序时,我都会滚动自己的系统。 诸如此类(取自我的Java OpenGL Minecraft克隆here):

    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");

注意:setContentsreadContents实际上并不存在,但您知道了:)

PS Utils.loadFile返回以字符串形式传入的文件名的内容。