1

我正在使用 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”。

4

1 回答 1

0

尝试像这样指定 ogl 版本:

        PixelFormat pixelFormat = new PixelFormat();
        ContextAttribs contextAtrributes = new ContextAttribs(3, 2)
            .withForwardCompatible(true)
            .withProfileCore(true);

        Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
        Display.setTitle(WINDOW_TITLE);
        Display.create(pixelFormat, contextAtrributes);

...因为 Mac 默认支持最高版本的 OpenGL 2.1。在 OS X 10.7+ 上,您可以特别请求核心配置文件,这将使您能够访问 OpenGL 3.2,但与 Windows 和 Linux 不同的是,您不能在标准 OpenGL 配置文件中混合使用 OpenGL 3+ 功能。

这里

于 2014-08-09T21:31:37.427 回答