我正在使用 LWJGL 创建 OpenGL 上下文。我可以让它在我的机器上运行(OpenGL 4.2 兼容)并且在 OpenGL 2.1 上也可以对简单着色器进行更改。我必须编写与 OpenGL 2.1 兼容的代码(着色器,或者更确切地说是它们的链接和编译,似乎是这里的问题)。我认为写起来很容易:
Frag 着色器:
#version 120
in vec4 pass_Color;
out vec4 out_Color;
void main(void) {
out_Color = pass_Color;
}
垂直着色器:
#version 120
in vec4 in_Position;
in vec4 in_Color;
out vec4 pass_Color;
uniform mat4 Model;
uniform mat4 View;
uniform mat4 Projection;
void main(void) {
gl_Position = Projection * View * Model * in_Position;
pass_Color = in_Color;
}
作为我的着色器的第一行并收工。但是,在一台带有支持 OpenGL 3.3 的显卡的机器上,这些着色器不会链接和编译。当改为
#version 330
// - or even -
#version 150
他们确实链接和编译。我已阅读有关兼容性、核心和前向兼容性的信息,据我了解,问题可能是 OpenGL 3.3 机器不支持 GLSL 1.20,除非在代码中指示它运行兼容性上下文(我可能措辞错误,请纠正我)。但我担心,因为 2.1 不知道 OpenGL 配置文件,所以在尝试设置上下文之前,我肯定需要做一些检查。
即使是这种情况,我也不完全确定如何执行正确的逻辑来确保显卡仅限于 OpenGL 2.1(和相应的 GLSL 版本)的机器和具有更高版本(3.3、4.2 等)的机器也会接受它(使用 LWJGL)。
请注意,我希望尽可能将代码保留为“现代 OpenGL”。