【问题标题】:Linking and compiling shaders for OpenGL 3.3 and 2.1 using LWJGL使用 LWJGL 为 OpenGL 3.3 和 2.1 链接和编译着色器
【发布时间】: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 着色器,然后将其输入 inout,直到 GLSL 1.3 才为顶点着色器输入/输出定义它们。您需要使用varyingattribute
  • 好吧,所以我可以为每个版本使用不同的着色器(一个使用可变和属性,另一个使用 in 和 out),那会是理想的解决方案吗?检查 GL_VERSION 并根据它使用一个或另一个?
  • 是的,这听起来会奏效。你试过了吗?此外,在整个开发过程中,您必须谨慎使用一个版本支持而另一个版本不支持的功能。可能会导致着色器中出现大量条件编译。
  • 我已经在我自己的机器上尝试过,但目前我无法访问 OpenGL 2.1 机器。有没有办法用 4.2 支持卡模拟 OpenGL 2.1 显卡(如果我使用 2.1 不兼容的版本会出错)?如果不出意外,我会在下周测试它时回到这个。另外,感谢 Jarrett 对这些功能的提醒。

标签: java opengl glsl lwjgl


【解决方案1】:

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

来自here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多