短:
我可以定义每个着色器可以使用的功能吗? 或者我必须为每个着色器定义它?
整个故事:
我想创建多个着色器,用于使用预定义的渐变渐变(例如,http://www.thinkboxsoftware.com/storage/krakatoa-support-images/krakatoa15_kcm_densitybyage_gradientrampmap.png)为输入片段着色。
我想为每个着色器定义一个渐变渐变常量(一个vec4颜色样本数组,其中alpha值保持渐变位置,请参见上图中的Pos)
我需要一个函数,它可以从特定纹理坐标位置的给定渐变斜坡返回颜色样本。
所以斜坡需要每个着色器定义ONCE ,并且该函数应一次定义所有 ,每个着色器都可以安全使用
我有算法,问题是共享函数,并在GLSL中定义常量。
这可能吗? 或者我必须将函数复制到每个着色器?至少有一些预编译选项吗?
答案 0 :(得分:11)
你可以像在C中那样做 - 你在头文件中声明函数并在公共C文件中定义它。
在GLSL中,您需要执行以下操作:
在一些着色器(字符串)中定义函数(让我们称之为COMMON):
float getCommonValue() { return 42; }
在你想要使用这个函数的所有着色器中你只声明并使用它(让我们称之为SHADER1):
float getCommonValue();
void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); }
使用glCompileShader
编译着色器时,只编译一次COMMON着色器并将着色器GLuint存储在某处
当您为SHADER1链接程序与glLinkProgram
时,您使用glAttachShader
两个着色器 - COMMON和SHADER1附加到程序。因此,您可以将getCommonValue
函数从一个着色器调用到另一个着色器。
您可以多次为不同的sahder程序重复使用COMMON着色器GLuint值(SHADER1,SHADER2,...)。