使用LWJGL链接和编译OpenGL 3.3和2.1的着色器

时间:2013-11-08 23:01:06

标签: java opengl glsl lwjgl

我正在使用LWJGL来创建OpenGL上下文。我可以在我的机器上运行它(OpenGL 4.2兼容),并在OpenGL 2.1上更改简单的着色器。 我必须编写与OpenGL 2.1兼容的代码(着色器,或者说它们的链接和编译,似乎是这里的问题)。我认为写起来很容易:

Frag shader:

#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”。

1 个答案:

答案 0 :(得分: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);
  

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

来自here