const char* cc3D_Terrain_frag = STRINGIFY(
\n#ifdef GL_ES\n
precision mediump float;
\n#endif\n
uniform vec3 u_color;\n
varying vec2 v_texCoord;\n
varying vec3 v_normal;\n
\n#ifdef GL_ES\n
uniform lowp int u_has_alpha;\n
uniform lowp int u_has_light_map;\n
\n#else\n
uniform int u_has_alpha;\n
uniform int u_has_light_map;\n
\n#endif\n
uniform sampler2D u_alphaMap;\n
uniform sampler2D u_texture0;\n
uniform sampler2D u_texture1;\n
uniform sampler2D u_texture2;\n
uniform sampler2D u_texture3;\n
uniform sampler2D u_lightMap;\n
uniform float u_detailSize[4];\n
uniform vec3 u_lightDir;\n
void main()\n
{\n
vec4 lightColor;\n
if(u_has_light_map<=0)\n
{\n
    lightColor = vec4(1.0,1.0,1.0,1.0);\n
}else\n
{\n
    lightColor = texture2D(u_lightMap,v_texCoord);\n
}
float lightFactor = dot(-u_lightDir,v_normal);\n
if(u_has_alpha<=0)\n
{\n
    gl_FragColor = texture2D(u_texture0, v_texCoord)*lightColor*lightFactor;\n
}else\n
{\n
    vec4 blendFactor =texture2D(u_alphaMap,v_texCoord);\n
    vec4 color = vec4(0.0,0.0,0.0,0.0);\n
    color = texture2D(u_texture0, v_texCoord*u_detailSize[0])*blendFactor.r +
    texture2D(u_texture1, v_texCoord*u_detailSize[1])*blendFactor.g + texture2D(u_texture2, v_texCoord*u_detailSize[2])*blendFactor.b
        + texture2D(u_texture3, v_texCoord*u_detailSize[3])*(1.0 - blendFactor.a);
    gl_FragColor = vec4(color.rgb*lightColor.rgb*lightFactor, 1.0);
}
}
);