Search code examples
macosopengl-eslibgdxglslosx-mavericks

Opengl es 2.0 GLSL compiling fails on OSX when using const


i'm a little frustrated. I'm about to use a mac (OS X mavericks) for coding stuff.

My shader works fine under windows 7 and android. When i'm running my app under OS X i'm getting the following compiler errors during runtime.

Exception in thread "LWJGL Application" java.lang.IllegalStateException: ERROR: 0:6: Initializer not allowed
ERROR: 0:6: Use of undeclared identifier 'light'
ERROR: 0:6: Use of undeclared identifier 'spec'
ERROR: 0:6: Use of undeclared identifier 'spec'
ERROR: 0:6: Use of undeclared identifier 'spec'

Fragment Shader Snippet:

 String fragmentShader =   
                "#ifdef GL_ES\n" +
                "precision mediump float;\n" +
                "#endif\n" +
                "uniform sampler2D cubeMap;\n"+
                "uniform sampler2D normalMap;"+                 
                "varying vec2 v_TexCoords;"+

                "void main() {\n"+

                "   const vec4 ambientColor = vec4(1.0, 1.0, 1.0, 1.0);" +
                "   const vec4 diffuseColor = vec4(1.0, 1.0, 1.0, 1.0);"+
                "   const vec3 light =  normalize(vec3(-0.5,-0.8,-1.0));"+

                "   vec3 camDir = normalize(vec3(v_TexCoords,0) - vec3(0.5,0.5,10.0));"+ 
                "   vec4 normalPxl = texture2D(normalMap,v_TexCoords);" +
                "   vec3 normal = normalize(normalPxl.xyz - vec3(0.5,0.5,0.5));"+ 


                "   vec3 reflectDir = reflect(camDir,normal);"+   

                "   float spec = pow(max(0.0,dot(camDir,reflect(light,normal))),4.0);"+
                "   gl_FragColor = vec4(texture2D(cubeMap, reflectDir.xy * 0.5+0.5).xyz,normalPxl.w-0.1)"+
....

I've red through OpenGL Specs and found nothing problematic with using const or declaring some variables in main.

Appreciate your Help


Solution

  • I'll repost my comment here so that this could be closed out, but it appears that the GLSL compiler on OS X didn't like this line:

    const vec3 light =  normalize(vec3(-0.5,-0.8,-1.0));
    

    where a calculated value was being assigned to a constant. It may not optimize that out, where other compilers do. Replacing the normalization with the end vector it produces should fix this.

    If you think this is a bug, I recommend filing it at http://bugreport.apple.com , because I know Apple's OpenGL driver team does pay attention to cases like this and has fixed them in the past.