const renderEngine = cc.renderer.renderEngine; const renderer = renderEngine.renderer; let ShaderMaterial = require('ShaderMaterial'); var timelimit =1 const shader = { name: 'Wave', params: [ { name: 'time', type: renderer.PARAM_FLOAT }, { name: 'u_normalMap', type: renderer.PARAM_TEXTURE_2D }, ], start(material,params) { material.cusparmas = {} material.cusparmas._start = 0; material.setParamValue('u_normalMap', params.normaltexture._texture);//偏移值 (调整该值改变流光的倾斜程度) }, update(material,dt) { material.cusparmas._start+=dt*0.2 //var deltatime = Math.sin(( material.cusparmas._start)/1000); material.setParamValue('time',Math.sin(material.cusparmas._start)*2); }, defines:[], frag: `varying vec4 v_fragmentColor; varying vec2 uv0; uniform sampler2D texture; uniform sampler2D u_normalMap; uniform float time; vec3 waveNormal(vec2 p) { vec3 normal = texture2D(u_normalMap , p ).xyz; normal = -1.0 + normal * 2.0; return normalize(normal); } //高光计算 参见基本光照公式 //参数说明:n法向量, l入射光向量, e观察向量 float specular(vec3 n,vec3 l,vec3 e) { return pow(max(dot(reflect(e,n),l),0.0),2.0); } void main() { float timeFactor = 0.1; float offsetFactor = 0.5; float refractionFactor = 0.7; // simple UV animation vec3 normal = waveNormal(uv0 + vec2(time * timeFactor,time * timeFactor)); // simple calculate refraction UV offset vec2 p = -1.0 + 2.0 * uv0; vec3 eyePos = vec3(0.0, 0.0, 10.0);//眼睛的位置 在中心点正上方 vec3 inVec = normalize(vec3(p, 0.0) - eyePos); vec3 refractVec = refract(inVec, normal, refractionFactor); vec2 v_texCoordN = uv0; v_texCoordN += refractVec.xy * offsetFactor; vec3 light = vec3(0.2,0.1,0.0); // bteitler: Apply specular highlight vec3 normalN = waveNormal(v_texCoordN ); vec3 color = vec3(specular(normalN,light,eyePos)); //gl_FragColor = texture2D(texture, v_texCoordN); //这样可以看到不带高光的水面,可选 // gl_FragColor = texture2D(u_normalMap, uv0); //这样可以只看法线图,可选 gl_FragColor = texture2D(texture, v_texCoordN)*1.0 + vec4(color,1); //加了高光效果的水面 } `, }; ShaderMaterial.addShader(shader);