zhuguoqing ff550d5d6a init
2022-05-22 10:32:02 +08:00

75 lines
2.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);