OpenGL/GLSL - 使用glShaderSource和多个源来支持包含文件

Pyg*_*gmy 5 opengl shader glsl pragma include

由于GLSL没有包含文件选项,我试图通过使用"#pragma include"解析器来添加它.(我想要这个,因为我有一些通用的方法,我只想实现一次,但可能会在许多不同的着色器中使用,比如Ken Perlin的平滑步骤)

解析着色器文件以获取包含的文件可以正常工作.但是当使用多个源文件设置ShaderSource时,我总是遇到问题; 因为我的主着色器通常以"#version 330"开头而且#version-line总是必须是着色器中的第一行,所以我只能将我的主文件添加为传递给glShadersource的字符串数组中的第一行,之后所有包含的文件.但是我的主文件不能使用那些包含文件中实现的任何函数,因为它们基本上会我的主文件之后连接,因此编译器抱怨它不知道我的主文件正在使用的函数.

我能想到让它工作的唯一方法是读取主文件,解析include pragma,然后将该pragma行替换为要包含的文件的文件内容(递归地将相同的方法应用于所有包含的可能包含其他文件的文件) - 但这意味着编译错误中的编号将不再与主文件的真实编号相匹配.

是否有人为GLSL设置了某种"包含"功能,并保留了亚麻布?如果是这样 - 怎么样?

Chr*_*ica 3

解析#version标签并将其作为单独的(也是第一个)源字符串怎么样?这样,您还可以在包含文件中拥有不同的版本标签(取决于它们的功能要求),并将它们减少到只有一个版本标签(版本号最高的版本标签)。