在阅读OpenGL规范时,我始终注意到它提到您可以在单个程序中包含多个相同类型的着色器(即,多个附加了glAttachShader的GL_VERTEX_SHADER )。特别是在OpenGL 4.2,§2.11.3,程序对象中:“同一类型的多个着色器对象可以附加到单个程序对象...”。
OpenGL流水线程序和子例程可能适用于这里,但这是在它们存在之前定义的(实际上它可以追溯到2.1规范,§2.15.2),所以我正在寻找这个想法的GL4之前的示例。当我做一些简单的测试时,我发现包含多个void main()
会导致链接错误。有没有人知道使用它的一个实际例子?
发布于 2012-02-07 06:38:17
可以将常用函数放在单独的着色器中。然后只编译一次,并链接到多个程序中。
这与只编译一次cpp文件以获得静态或共享库的方式类似。然后将该库链接到多个可执行程序中,从而节省编译时间。
假设你有复杂的照明功能:
vec3 ComputeLighting(vec3 position, vec3 eyeDir)
{
// ...
return vec3(...);
}
然后,对于要使用此功能的每个着色器,请执行以下操作:
vec3 ComputeLighting(vec3 position, vec3 eyeDir);
void main()
{
vec3 light = ComputeLighting(arg1, arg2);
gl_FragColor = ...;
}
然后分别编译公共着色器和主着色器。但是只编译一次公共着色器。
https://stackoverflow.com/questions/9168252
复制相似问题