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

我正在使用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;
}

Vert着色器:

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


尝试像这样指定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+功能。

从这里。

链接地址: http://www.djcxy.com/p/38515.html

上一篇: Linking and compiling shaders for OpenGL 3.3 and 2.1 using LWJGL

下一篇: Supporting between GL versions 3.1 and 4.x