75 lines
2.7 KiB
JavaScript
75 lines
2.7 KiB
JavaScript
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); |