编译着色器 GLSL 3.30 时出错

Posted

技术标签:

【中文标题】编译着色器 GLSL 3.30 时出错【英文标题】:Error when compiling shaders GLSL 3.30 【发布时间】:2016-07-01 11:21:13 【问题描述】:

我通过以下方式创建上下文:

new sf::Window(sf::VideoMode(800, 600), "OpenGL",
                                             sf::Style::Default, 
                                             sf::ContextSettings(24, 8, 0, 3, 3, sf::ContextSettings::Core)));

我正在通过 glLoadGen 为 OpenGL 3.3 Core Profile 加载扩展,其中包含一个扩展 EXT_texture_compression_s3tc。当我编译着色器时:

#version 330 core

layout (location = 0) in vec3 vertPos;

layout (location = 5) uniform mat4 modelMat;
layout (location = 6) uniform mat4 viewMat;
layout (location = 7) uniform mat4 projectionMat;

out vec4 fragColor;

void main()

    gl_Position = projectionMat * viewMat * modelMat * vec4(vertPos, 1.0);
    fragColor = vec4(0.5, 0.5, 0.5, 1.0);

``

#version 330 core

in vec4 fragColor;
out vec4 outColor;

void main()

    outColor = fragColor;

我得到错误字符串:

ERROR: Shader compilation error at shader: "media/shaders/shader.vs.glsl"
0:7(1): error: uniform explicit location requires GL_ARB_explicit_uniform_location and either GL_ARB_explicit_attrib_location or GLSL 3.30.
0:8(1): error: uniform explicit location requires GL_ARB_explicit_uniform_location and either GL_ARB_explicit_attrib_location or GLSL 3.30.
0:9(1): error: uniform explicit location requires GL_ARB_explicit_uniform_location and either GL_ARB_explicit_attrib_location or GLSL 3.30.

但我有 OpenGL 3.3(所以 GLSL 3.30)。 glxinfo 打印:

Extended renderer info (GLX_MESA_query_renderer):
    Vendor: X.Org (0x1002)
    Device: AMD JUNIPER (DRM 2.43.0, LLVM 3.8.0) (0x68be)
    Version: 11.2.0
    Accelerated: yes
    Video memory: 512MB
    Unified memory: no
    Preferred profile: core (0x1)
    Max core profile version: 3.3
    Max compat profile version: 3.0
    Max GLES1 profile version: 1.1
    Max GLES[23] profile version: 3.0
OpenGL vendor string: X.Org
OpenGL renderer string: Gallium 0.4 on AMD JUNIPER (DRM 2.43.0, LLVM 3.8.0)
OpenGL core profile version string: 3.3 (Core Profile) Mesa 11.2.0
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:

所以我应该可以使用 GLSL 3.30。

【问题讨论】:

GL_ARB_explicit_uniform_location 扩展真的存在吗?从错误消息的措辞来看,我猜它需要即使 glsl 3.30 可用。 它可用,但消息说or GLSL 3.30,我有OpenGL core profile shading language version string: 3.30,所以程序应该可以工作。 【参考方案1】:

在着色器中指定统一位置的功能不是 OpenGL 3.3 版或 GLSL 3.30 版的一部分。它只是 GL 4.3 或 GLSL 4.30 的核心功能。指定顶点着色器输入和片段着色器输出位置的能力是 3.30,但统一位置不是。

明确的统一位置规范实际上并不需要特殊硬件;它纯粹是一个接口的东西。因此,4.x 之前的硬件可以实现它。但是,如果您的硬件仅限于 GL 3.3,那么很有可能硬件太旧以至于 IHV 停止使用新的 OpenGL 功能对其进行更新。因此,即使它可以支持它,该功能也是在 IHV 停止更新硬件之后出现的。

虽然 NVIDIA 已将一些仅限 3.3 的硬件在最近的非硬件功能上保持在最新状态,但英特尔或 AMD 却不能这样说。因此,即使您有一个可以运行的 NVIDIA 3.x GPU,英特尔或 AMD 的 3.x GPU 也可能无法运行。

在您的情况下,“Juniper”指的是 Radeon 67xx 系列。这些是 GL 4.x 部件。但是,您使用的是开源驱动程序而不是 AMD 的实际 Linux 驱动程序,因此您只能从中获得 3.3。

最好调整您所需的 OpenGL 版本以匹配您的着色器。但是,如果您希望将其保留为 3.30 着色器并将其用作扩展(因为您使用的是开源驱动程序而不是 AMD 的驱动程序),您需要在 #version 声明下方添加一个 extension declaration:

#extension GL_ARB_explicit_uniform_location : require

【讨论】:

我有 Radeon HD5750,在 Windows 上我有 OGL 4.4,但在 Ubuntu Linux 上我只有 OGL 3.3,在新的 Linux Kernel 4.x fglrx(提供 OGL 4.4)上不起作用。我正在考虑将我的发行版更改为具有最新 libdrm、llvm 和 libmesa 的发行版(它会给我 OpenGL 4.1)。 ;(【参考方案2】:

您可以尝试在#version 330 core下方添加启用扩展的以下行:

#extension GL_ARB_explicit_uniform_location : require

【讨论】:

以上是关于编译着色器 GLSL 3.30 时出错的主要内容,如果未能解决你的问题,请参考以下文章

运行时的 glsl 着色器编译问题

GLSL 着色器未编译,没有错误消息

我的 GLSL 着色器程序链接正常,但是当我尝试使用它时出错——我该如何调试它?

从 C++ 运行 GLSL 着色器(尚未编译)的最快捷方式是啥?

为啥 OSX Mavericks 不能编译我的 GLSL 着色器?

GLSL-片段着色器不同部分的精度不同