【问题标题】:GLSL reusable/shared functions, shared constants (OpenGL ES 2.0)?GLSL 可重用/共享函数、共享常量(OpenGL ES 2.0)?
【发布时间】:2012-05-14 21:28:40
【问题描述】:

短:

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


整个故事:

所以渐变需要每个着色器定义一次,并且函数应该一次性定义所有每个着色器都可以安全使用.

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以像在 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. 当您将程序与 glLinkProgram 链接到 SHADER1 时,您将使用 glAttachShader 两个着色器 - COMMON 和 SHADER1 附加到程序。因此,您将能够从一个着色器调用getCommonValue 函数到另一个着色器。

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

    【讨论】:

    • 哇,听起来不错,我试试看。
    • 我们创建shader的时候COMMONshader的类型应该是什么?
    • 我和@UltimatePea 有同样的问题。共享着色器应该是顶点、片段还是无关紧要?
    • 我还没有尝试过,但是ES 2.0 spec 状态为Multiple shader objects of the same type may not be attached to a single program object
    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多