我有點沮喪。我即將使用mac(OS X mavericks)來編寫代碼。Opengl es 2.0在使用const時,OSX上的GLSL編譯失敗
我的着色器在Windows 7和Android下工作正常。 當我在OS X下運行我的應用程序時,運行期間出現以下編譯器錯誤。
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'
片斷着色段:
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)"+
....
我已經紅透的OpenGL規格並沒有發現使用const或聲明的主變量的一些問題。
感謝您的幫助
確定,即「常量」就是這個道理或這只是一個假設嗎? – Springrbua
它在我看來,問題是線'const vec3 light = normalize(vec3(-0.5,-0.8,-1.0));',在那裏你設置一個常數值一個函數的結果,着色器編譯器可能不知道將其減少到一個常量值,所以你可以用實際的向量歸一化它的結果嗎? –
是的,你在哪裏,這是正常化調用。 Thx很多,你做了我的da年。有趣的是,android GL驅動程序正在處理的不僅僅是桌面系統的驅動程序。請將您的解決方案作爲答案發布。 – fky