【发布时间】:2013-11-08 23:01:05
【问题描述】:
我正在使用 LWJGL 创建 OpenGL 上下文。我可以让它在我的机器上运行(OpenGL 4.2 兼容)并且在 OpenGL 2.1 上也可以对简单着色器进行更改。 我必须编写与 OpenGL 2.1 兼容的代码(着色器,或者更确切地说是它们的链接和编译,似乎是这里的问题)。我认为写起来很容易:
片段着色器:
#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”。
【问题讨论】:
-
无论它支持哪个版本,任何机器都不应该编译这些着色器(至少在没有一些严重的编译器警告的情况下不会)。您已经告诉 GLSL 编译器将其编译为 GLSL 1.2 着色器,然后将其输入
in和out,直到 GLSL 1.3 才为顶点着色器输入/输出定义它们。您需要使用varying和attribute。 -
好吧,所以我可以为每个版本使用不同的着色器(一个使用可变和属性,另一个使用 in 和 out),那会是理想的解决方案吗?检查 GL_VERSION 并根据它使用一个或另一个?
-
是的,这听起来会奏效。你试过了吗?此外,在整个开发过程中,您必须谨慎使用一个版本支持而另一个版本不支持的功能。可能会导致着色器中出现大量条件编译。
-
我已经在我自己的机器上尝试过,但目前我无法访问 OpenGL 2.1 机器。有没有办法用 4.2 支持卡模拟 OpenGL 2.1 显卡(如果我使用 2.1 不兼容的版本会出错)?如果不出意外,我会在下周测试它时回到这个。另外,感谢 Jarrett 对这些功能的提醒。