GLSL可重用/共享函数,共享常量(OpenGL ES 2.0)?

时间:2012-05-05 16:58:42

标签: glsl opengl-es-2.0 fragment-shader

短:

我可以定义每个着色器可以使用的功能吗? 或者我必须为每个着色器定义它?


整个故事:

所以斜坡需要每个着色器定义ONCE ,并且该函数应一次定义所有 ,每个着色器都可以安全使用

我有算法,问题是共享函数,并在GLSL中定义常量。

这可能吗? 或者我必须将函数复制到每个着色器?至少有一些预编译选项吗?

1 个答案:

答案 0 :(得分:11)

你可以像在C中那样做 - 你在头文件中声明函数并在公共C文件中定义它。

在GLSL中,您需要执行以下操作:

  1. 在一些着色器(字符串)中定义函数(让我们称之为COMMON):

    float getCommonValue() { return 42; }
    
  2. 在你想要使用这个函数的所有着色器中你只声明并使用它(让我们称之为SHADER1):

    float getCommonValue();
    void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); }
    
  3. 使用glCompileShader编译着色器时,只编译一次COMMON着色器并将着色器GLuint存储在某处

  4. 当您为SHADER1链接程序与glLinkProgram时,您使用glAttachShader两个着色器 - COMMON和SHADER1附加到程序。因此,您可以将getCommonValue函数从一个着色器调用到另一个着色器。

  5. 您可以多次为不同的sahder程序重复使用COMMON着色器GLuint值(SHADER1,SHADER2,...)。