evas 3d: Fix shaders compilation (parallax and normal)

My nvidia EGL driver coultn't compile some shaders because of
the error:
  error C1059: non constant expression in initialization

The proposed patch at D4068 is not acceptable since it just
brings the original problem back. Instead, make sure all vec3
variables are initialized in main() or another function, not in
the global scope.

I tested all examples in evas
This commit is contained in:
Jean-Philippe Andre 2016-06-22 14:27:20 +09:00
parent 8a27315878
commit 41e17f7e73
4 changed files with 52 additions and 22 deletions

View File

@ -185,7 +185,8 @@ static const char diffuse_frag_glsl[] =
" vec4 color;\n"
" \n"
"#ifdef DIFFUSE_TEXTURE_BLEND\n"
" vec3 Tex0CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n"
" vec3 Tex0CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0;\n"
" vec3 Tex1CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n"
" color = mix(texture2D(uTextureDiffuse1, vec2(Tex1CoordDiffuse)),\n"
" texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)), uTextureDiffuseWeight);\n"
" color *= uMaterialDiffuse;\n"
@ -471,7 +472,8 @@ static const char flat_frag_glsl[] =
"#ifdef DIFFUSE\n"
" \n"
"#ifdef DIFFUSE_TEXTURE_BLEND\n"
" vec3 Tex0CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n"
" vec3 Tex0CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0;\n"
" vec3 Tex1CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n"
" color = mix(texture2D(uTextureDiffuse1, vec2(Tex1CoordDiffuse)),\n"
" texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)), uTextureDiffuseWeight);\n"
" color *= uMaterialDiffuse;\n"
@ -490,7 +492,8 @@ static const char flat_frag_glsl[] =
"#ifdef SPECULAR\n"
" \n"
"#ifdef SPECULAR_TEXTURE_BLEND\n"
" vec3 Tex0CoordSpecular = vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular1;\n"
" vec3 Tex0CoordSpecular = vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular0;\n"
" vec3 Tex1CoordSpecular = vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular1;\n"
" color = mix(texture2D(uTextureSpecular1, vec2(Tex1CoordSpecular)),\n"
" texture2D(uTextureSpecular0, vec2(Tex0CoordSpecular)), uTextureSpecularWeight);\n"
" color *= uMaterialSpecular;\n"
@ -510,7 +513,8 @@ static const char flat_frag_glsl[] =
"#ifdef AMBIENT\n"
" \n"
"#ifdef AMBIENT_TEXTURE_BLEND\n"
" vec3 Tex0CoordAmbient = vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient1;\n"
" vec3 Tex0CoordAmbient = vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient0;\n"
" vec3 Tex1CoordAmbient = vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient1;\n"
" color = mix(texture2D(uTextureAmbient1, vec2(Tex1CoordAmbient)),\n"
" texture2D(uTextureAmbient0, vec2(Tex0CoordAmbient)), uTextureAmbientWeight);\n"
" color *= uMaterialAmbient;\n"
@ -527,7 +531,8 @@ static const char flat_frag_glsl[] =
"#ifdef EMISSION\n"
" \n"
"#ifdef EMISSION_TEXTURE_BLEND\n"
" vec3 Tex0CoordEmission = vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission1;\n"
" vec3 Tex0CoordEmission = vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission0;\n"
" vec3 Tex1CoordEmission = vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission1;\n"
" color = mix(texture2D(uTextureEmission1, vec2(Tex1CoordEmission)),\n"
" texture2D(uTextureEmission0, vec2(Tex0CoordEmission)), uTextureEmissionWeight);\n"
" color *= uMaterialEmission;\n"
@ -814,7 +819,8 @@ static const char phong_frag_glsl[] =
"#ifdef DIFFUSE\n"
" \n"
"#ifdef DIFFUSE_TEXTURE_BLEND\n"
" vec3 Tex0CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n"
" vec3 Tex0CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0;\n"
" vec3 Tex1CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n"
" color = mix(texture2D(uTextureDiffuse1, vec2(Tex1CoordDiffuse)),\n"
" texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)), uTextureDiffuseWeight);\n"
" color *= uMaterialDiffuse;\n"
@ -838,7 +844,8 @@ static const char phong_frag_glsl[] =
" factor = pow(factor, uMaterialShininess);\n"
" \n"
"#ifdef SPECULAR_TEXTURE_BLEND\n"
" vec3 Tex0CoordSpecular = vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular1;\n"
" vec3 Tex0CoordSpecular = vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular0;\n"
" vec3 Tex1CoordSpecular = vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular1;\n"
" color = mix(texture2D(uTextureSpecular1, vec2(Tex1CoordSpecular)),\n"
" texture2D(uTextureSpecular0, vec2(Tex0CoordSpecular)), uTextureSpecularWeight);\n"
" color *= uMaterialSpecular;\n"
@ -862,7 +869,8 @@ static const char phong_frag_glsl[] =
"#ifdef AMBIENT\n"
" \n"
"#ifdef AMBIENT_TEXTURE_BLEND\n"
" vec3 Tex0CoordAmbient = vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient1;\n"
" vec3 Tex0CoordAmbient = vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient0;\n"
" vec3 Tex1CoordAmbient = vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient1;\n"
" color = mix(texture2D(uTextureAmbient1, vec2(Tex1CoordAmbient)),\n"
" texture2D(uTextureAmbient0, vec2(Tex0CoordAmbient)), uTextureAmbientWeight);\n"
" color *= uMaterialAmbient;\n"
@ -884,7 +892,8 @@ static const char phong_frag_glsl[] =
"#ifdef EMISSION\n"
" \n"
"#ifdef EMISSION_TEXTURE_BLEND\n"
" vec3 Tex0CoordEmission = vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission1;\n"
" vec3 Tex0CoordEmission = vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission0;\n"
" vec3 Tex1CoordEmission = vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission1;\n"
" color = mix(texture2D(uTextureEmission1, vec2(Tex1CoordEmission)),\n"
" texture2D(uTextureEmission0, vec2(Tex0CoordEmission)), uTextureEmissionWeight);\n"
" color *= uMaterialEmission;\n"
@ -1247,7 +1256,9 @@ static const char normal_map_frag_glsl[] =
" vec3 normal;\n"
" vec4 color;\n"
" vec4 fragcolor;\n"
" vec3 Tex0CoordNormal = vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal0;\n"
"#ifdef NORMAL_TEXTURE_BLEND\n"
" vec3 Tex1CoordNormal = vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal1;\n"
" normal = texture2D(uTextureNormal0, vec2(Tex0CoordNormal)).rgb * uTextureNormalWeight / texture2D(uTextureNormal0, vec2(Tex0CoordNormal)).a;\n"
" normal += texture2D(uTextureNormal1, vec2(Tex1CoordNormal)).rgb / texture2D(uTextureNormal1, vec2(Tex1CoordNormal)).a *\n"
" (1.0 - uTextureNormalWeight);\n"
@ -1273,7 +1284,8 @@ static const char normal_map_frag_glsl[] =
"#ifdef DIFFUSE\n"
" \n"
"#ifdef DIFFUSE_TEXTURE_BLEND\n"
" vec3 Tex0CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n"
" vec3 Tex0CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse0;\n"
" vec3 Tex1CoordDiffuse = vec3(vTexCoord, 1.0) * uTextureMatrixTransformDiffuse1;\n"
" color = mix(texture2D(uTextureDiffuse1, vec2(Tex1CoordDiffuse)),\n"
" texture2D(uTextureDiffuse0, vec2(Tex0CoordDiffuse)), uTextureDiffuseWeight);\n"
" color *= uMaterialDiffuse;\n"
@ -1296,7 +1308,8 @@ static const char normal_map_frag_glsl[] =
" factor = pow(factor, uMaterialShininess);\n"
" \n"
"#ifdef SPECULAR_TEXTURE_BLEND\n"
" vec3 Tex0CoordSpecular = vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular1;\n"
" vec3 Tex0CoordSpecular = vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular0;\n"
" vec3 Tex1CoordSpecular = vec3(vTexCoord, 1.0) * uTextureMatrixTransformSpecular1;\n"
" color = mix(texture2D(uTextureSpecular1, vec2(Tex1CoordSpecular)),\n"
" texture2D(uTextureSpecular0, vec2(Tex0CoordSpecular)), uTextureSpecularWeight);\n"
" color *= uMaterialSpecular;\n"
@ -1320,7 +1333,8 @@ static const char normal_map_frag_glsl[] =
"#ifdef AMBIENT\n"
" \n"
"#ifdef AMBIENT_TEXTURE_BLEND\n"
" vec3 Tex0CoordAmbient = vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient1;\n"
" vec3 Tex0CoordAmbient = vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient0;\n"
" vec3 Tex1CoordAmbient = vec3(vTexCoord, 1.0) * uTextureMatrixTransformAmbient1;\n"
" color = mix(texture2D(uTextureAmbient1, vec2(Tex1CoordAmbient)),\n"
" texture2D(uTextureAmbient0, vec2(Tex0CoordAmbient)), uTextureAmbientWeight);\n"
" color *= uMaterialAmbient;\n"
@ -1340,7 +1354,8 @@ static const char normal_map_frag_glsl[] =
"#ifdef EMISSION\n"
" \n"
"#ifdef EMISSION_TEXTURE_BLEND\n"
" vec3 Tex0CoordEmission = vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission1;\n"
" vec3 Tex0CoordEmission = vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission0;\n"
" vec3 Tex1CoordEmission = vec3(vTexCoord, 1.0) * uTextureMatrixTransformEmission1;\n"
" color = mix(texture2D(uTextureEmission1, vec2(Tex1CoordEmission)),\n"
" texture2D(uTextureEmission0, vec2(Tex0CoordEmission)), uTextureEmissionWeight);\n"
" color *= uMaterialEmission;\n"
@ -1767,15 +1782,13 @@ static const char parallax_occlusion_frag_glsl[] =
"uniform mat3 uTextureMatrixTransformNormal0;\n"
"#ifdef NEED_TEX_COORD\n"
"varying vec2 vTexCoord;\n"
"vec3 Tex0CoordNormal =\n"
" vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal0;\n"
"vec3 Tex0CoordNormal;\n"
"#endif //TEX_COORD\n"
"#ifdef NORMAL_TEXTURE_BLEND\n"
"uniform sampler2D uTextureNormal1;\n"
"uniform float uTextureNormalWeight;\n"
"uniform mat3 uTextureMatrixTransformNormal1;\n"
"vec3 Tex1CoordNormal =\n"
" vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal1;\n"
"vec3 Tex1CoordNormal;\n"
"#endif //NORMAL_TEXTURE_BLEND\n"
"#ifdef FOG_ENABLED\n"
"uniform float uFogFactor;\n"
@ -2011,6 +2024,12 @@ static const char parallax_occlusion_frag_glsl[] =
"}\n"
"void main() {\n"
" vec4 color;\n"
"#ifdef NEED_TEX_COORD\n"
" Tex0CoordNormal = vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal0;\n"
"#endif // NEED_TEX_COORD\n"
"#ifdef NORMAL_TEXTURE_BLEND\n"
" Tex1CoordNormal = vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal1;\n"
"#endif //NORMAL_TEXTURE_BLEND\n"
"#ifdef SHADOWED\n"
" shadow = pcf(vLightPosition);\n"
"#endif //SHADOWED\n"

View File

@ -75,7 +75,8 @@ varying float vLightDist;
define(`FRAGMENT_SHADER_TEXTURE_BLEND', `
#ifdef $1_TEXTURE_BLEND
vec3 Tex0Coord$2 = vec3(vTexCoord, 1.0) * uTextureMatrixTransform$2`1';
vec3 Tex0Coord$2 = vec3(vTexCoord, 1.0) * uTextureMatrixTransform$2`0';
vec3 Tex1Coord$2 = vec3(vTexCoord, 1.0) * uTextureMatrixTransform$2`1';
color = mix(texture2D(uTexture$2`1', vec2(Tex1Coord$2)),
texture2D(uTexture$2`0', vec2(Tex0Coord$2)), uTexture$2Weight);
color *= uMaterial$2;

View File

@ -47,7 +47,10 @@ vec4 fragmentNormalMap()
vec3 normal;
vec4 color;
vec4 fragcolor;
vec3 Tex0CoordNormal = vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal0;
#ifdef NORMAL_TEXTURE_BLEND
vec3 Tex1CoordNormal = vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal1;
normal = texture2D(uTextureNormal0, vec2(Tex0CoordNormal)).rgb * uTextureNormalWeight / texture2D(uTextureNormal0, vec2(Tex0CoordNormal)).a;
normal += texture2D(uTextureNormal1, vec2(Tex1CoordNormal)).rgb / texture2D(uTextureNormal1, vec2(Tex1CoordNormal)).a *
(1.0 - uTextureNormalWeight);

View File

@ -6,16 +6,14 @@ uniform mat3 uTextureMatrixTransformNormal0;
#ifdef NEED_TEX_COORD
varying vec2 vTexCoord;
vec3 Tex0CoordNormal =
vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal0;
vec3 Tex0CoordNormal;
#endif //TEX_COORD
#ifdef NORMAL_TEXTURE_BLEND
uniform sampler2D uTextureNormal1;
uniform float uTextureNormalWeight;
uniform mat3 uTextureMatrixTransformNormal1;
vec3 Tex1CoordNormal =
vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal1;
vec3 Tex1CoordNormal;
#endif //NORMAL_TEXTURE_BLEND
FRAGMENT_SHADER_USE_FOG
@ -215,6 +213,15 @@ vec4 fragmentParallaxMap()
void main() {
vec4 color;
#ifdef NEED_TEX_COORD
Tex0CoordNormal = vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal0;
#endif // NEED_TEX_COORD
#ifdef NORMAL_TEXTURE_BLEND
Tex1CoordNormal = vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal1;
#endif //NORMAL_TEXTURE_BLEND
#ifdef SHADOWED
shadow = pcf(vLightPosition);
#endif //SHADOWED