2014-09-22 62 views
1

我目前正在嘗試在iOS上的GLSL OpenGL ES着色器中減少我的主要函數的大小。因此我提取了一些輔助函數,並在不同的着色器對象中聲明和編譯它們。之後,我想在鏈接用於渲染的程序之前,使用glAttachShader將它們重新鏈接在一起。所有的設置都已經完成,不幸的是,包含我的主函數的着色器將無法編譯,因爲它無法找到對單獨着色器中聲明的函數的引用。我如何告訴編譯器包含引用?從不同着色器導入函數

+0

你可能有興趣在這個崗位這裏:http://stackoverflow.com/questions/10754437/how-to-using-the-include-in-glsl-support-arb-shading-language-include – Blarglenarf 2014-09-23 05:19:45

+0

afaik,GLSL源碼最終全部內聯,沒有'call'功能。你可以用自定義的'#inc'將源文件縫合在一起,並且它可以正常工作(或者在桌面GL的情況下@ Blarglenarf的擴展)。 – jozxyqk 2014-09-23 06:36:39

+0

是的,我已經看過,不是我想要的。如果這是不可能的,爲什麼你可以使用glAttachShader添加多個着色器? – 2014-09-23 07:53:26

回答

2

在你的問題中有一些混雜的術語。這裏涉及兩個相關但不同的結構:

  • 函數聲明(又名原型),只聲明瞭返回類型,函數名和參數。它具有以下形式:

    returnType functionName(type0 arg0, type1 arg1, ..., typen argn); 
    
  • 函數定義,其具有聲明的所有部分,以及實現該功能的身體。它有以下形式:

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

如果分裂功能的實現爲不同的着色器,函數定義在包含該函數的實際代碼分開着色器。但是,在包含main函數的着色器或調用它的任何其他着色器中,您仍然需要聲明

一旦聲明函數,即使實現處於不同的着色器中,也可以調用它。從規格:

所有函數必須在被調用之前用原型聲明或使用主體定義。

+0

非常感謝,現在包含主函數的着色器似乎可以正確編譯!不幸的是,現在程序鏈接失敗,說「沒有片段着色器中的主定義」 – 2014-09-23 07:52:00