编译着色器GLSL 3.30时出错

时间:2016-07-01 11:21:14

标签: c++ linux opengl

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

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。

2 个答案:

答案 0 :(得分:3)

在着色器中指定统一位置的功能不是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 GL_ARB_explicit_uniform_location : require 声明:

Range("B12:C12").Delete Shift:=xlUp

答案 1 :(得分:0)

您可以尝试添加以下行,以启用#version 330 core下面的扩展程序:

#extension GL_ARB_explicit_uniform_location : require