2016-07-01 18 views
0

Ich schaffe Kontext von:Fehler beim Kompilieren Shadern GLSL 3.30

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

ich Erweiterungen von glLoadGen für OpenGL 3.3 Kernprofil mit einer Erweiterung EXT_texture_compression_s3tc geladen. Wenn ich Shader bin Kompilieren:

#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; 
} 

ich Fehler string:

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. 

aber ich habe OpenGL 3.3 (so GLSL 3.30). glxinfo druckt:

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: 

So greife ich kann GLSL 3.30 sein.

+0

Ist die Erweiterung 'GL_ARB_explicit_uniform_location' tatsächlich vorhanden? Aus dem Wortlaut der Fehlermeldung gehe ich davon aus, dass es auch dann noch glsl 3.30 geben muss. –

+0

Es ist verfügbar, aber die Nachricht sagt 'oder GLSL 3.30' und ich habe' OpenGL Core Profil Shading Sprache Version String: 3.30', so dass das Programm funktionieren sollte. – bajos

Antwort

0

Sie könnten versuchen, die folgende Zeile hinzugefügt, die die Erweiterung unter #version 330 core ermöglicht:

#extension GL_ARB_explicit_uniform_location : require 
3

Die Fähigkeit, einheitliche Positionen in einem Shader angeben ist nicht Teil der OpenGL Version 3.3 oder GLSL Version 3.30. Es ist nur ein Kernmerkmal von GL 4.3 oder GLSL 4.30. Die Möglichkeit, Vertex-Shader-Eingabe- und Fragment-Shader-Ausgabestandorte anzugeben, beträgt 3,30, jedoch nicht für einheitliche Standorte.

Explizite einheitliche Standortspezifikation nicht wirklich erfordern spezielle Hardware; es ist eine reine Interface-Sache. Daher könnte Pre-4.x-Hardware es implementieren. Wenn Ihre Hardware jedoch auf GL 3.3 beschränkt ist, besteht eine sehr gute Chance, dass die Hardware so alt ist, dass sie nicht mehr von der IHV mit neuen OpenGL-Funktionen aktualisiert wird. Obwohl dies unterstützt werden konnte, erschien das Feature, nachdem der IHV die Aktualisierung der Hardware gestoppt hatte.

Während NVIDIA einige ihrer 3.3-only-Hardware auf aktuellen, nicht-Hardware-Funktionen auf dem neuesten Stand gehalten hat, kann das gleiche nicht für Intel oder AMD gesagt werden. Selbst wenn Sie eine NVIDIA 3.x-GPU haben, mit der das funktioniert, ist es wahrscheinlich, dass die 3.x-GPUs von Intel oder AMD nicht funktionieren.

In Ihrem Fall bezieht sich "Juniper" auf die Radeon 67xx Linie. Dies sind GL 4.x Teile. Allerdings verwenden Sie den Open-Source-Treiber anstelle von AMDs aktuellem Linux-Treiber, so dass Sie nur 3.3 davon erhalten können.

Es wäre besser, die benötigte OpenGL-Version mit Ihrem Shader zu vergleichen. Wenn Sie jedoch wollen es als 3.30 Shader zu halten und verwenden Sie es als eine Erweiterung (da Sie die Open-Source-Treiber anstelle von AMDs Treiber verwenden), erhalten Sie eine extension declaration unter der #version Erklärung benötigen:

#extension GL_ARB_explicit_uniform_location : require 
+0

Ich habe Radeon HD5750, unter Windows habe ich OGL 4.4, aber auf Ubuntu Linux habe ich nur OGL 3.3, auf dem neuen Linux Kernel 4.x funktioniert fglrx (mit OGL 4.4) nicht. Ich denke darüber nach, meine Distro mit den neuesten libdrm, llvm und libmesa zu ändern (es würde mir OpenGL 4.1 geben). ( – bajos

Verwandte Themen