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

标签 opengl include glsl shader pragma

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

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

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

是否有人为 GLSL 设置了某种“包含”功能,该功能可以工作并保留行号?如果是这样 - 如何?

最佳答案

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

关于OpenGL/GLSL - 使用带有多个源的 glShaderSource 来支持包含文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6912457/

相关文章:

c++ - 在 GLSL C++ 中将射线与三角形相交

Android 和 Planet 渲染

c# - GUI、跨平台、C# 和 OpenGL。是否可以?

opengl - 如何从不同的线程绘制opengl图形?

php - 包含 PHP 文件的最佳做法是什么?

Javascript - 内联与包含 - 加载或运行有区别吗?

opengl - 为什么此Phong着色器起作用?

javascript - 使用 Emscripten 将 C++ ImpulseEngine 编译成 JavaScript

java - 尝试用鼠标移动四边形/正方形 - LWJGL

c++ - Visual Studio 的编译器在哪里搜索#includes?