从不同着色器导入功能

时间:2014-09-22 15:56:15

标签: objective-c iphone opengl-es glsl

我正在尝试在iOS上的GLSL OpenGL ES着色器中减小主函数的大小。因此,我提取了一些辅助函数,并在不同的着色器对象中声明和编译它们。之后我想在链接然后用于渲染的程序之前使用glAttachShader将它们重新链接在一起。所有设置都已完成,遗憾的是包含我的main函数的着色器将无法编译,因为它无法找到对单独着色器中声明的函数的引用。如何告诉编译器包含引用?

1 个答案:

答案 0 :(得分:2)

你的问题中有一些混淆的术语。这里涉及两个相关但不同的结构:

  • 函数声明(又称原型),它只声明返回类型,函数名和参数。它的格式为:

    returnType functionName(type0 arg0, type1 arg1, ..., typen argn);
    
  • 一个函数定义,它包含声明的所有部分,以及实现该函数的主体。它的格式为:

    returnType functionName(type0 arg0, type1 arg1, ..., typen argn) {
        // do some computation
        return returnValue;
    }
    

如果将函数实现拆分为不同的着色器,则函数定义位于包含函数实际代码的单独着色器中。但是,在包含main函数的着色器或任何其他调用它的着色器中,您仍然需要声明

声明函数后,即使实现位于不同的着色器中,也可以调用它。来自规范:

  

所有函数必须先用原型声明,或在调用之前用body定义。