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

Ger*_*eri 10 glsl fragment-shader opengl-es-2.0

短:

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


整个故事:

因此,坡道必须每个着色器定义一次,并且功能应该界定一次性每个着色器可以放心地使用.

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

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

Mār*_*iko 15

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

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

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

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

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

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

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

  • 当我们创建着色器时,`COMMON`着色器的类型应该是什么? (3认同)