我更新的变量的取值函数为sin,法线图和贴图的尺寸相同,应该是变量的取值函数的问题。
可以参考这个,native可用,webgl不知道怎么传texture。
var _default_vert = require("…/shaders/ccShader_Default_Vert.js");
var _default_vert_no_mvp = require("…/shaders/ccShader_Default_Vert_noMVP.js");
var _watereffect = require("…/shaders/ccShader_WaterEffect.js");
let Shader_WaterEffect = cc.Class({
extends: cc.Component,
properties: {
normalMapTextrue:{
default:null,
type:cc.SpriteFrame
}
},
onLoad: function () {
var self=this;
var now = new Date();
this.parameters={
startTime:Date.now(),
time:0.0,
};
self._use();
},
update:function(dt){
if(this._program){
this._program.use();
this.updateGLParameters();
if(cc.sys.isNative){
var glProgram_state = cc.GLProgramState.getOrCreateWithGLProgram(this._program);
glProgram_state.setUniformFloat( "iGlobalTime", this.parameters.time );
}else{
this._program.setUniformLocationWith1f( this._time, this.parameters.time );
}
}
},
updateGLParameters:function(){
this.parameters.time = Math.sin((Date.now() - this.parameters.startTime)/1000)/2;
//console.log('updadateGLParameters:',this.parameters.time);
},
_use: function(){
this._program = new cc.GLProgram();
if (cc.sys.isNative) {
cc.log("use native GLProgram");
this._program.initWithString(_default_vert_no_mvp, _watereffect);
this._program.addAttribute(cc.macro.ATTRIBUTE_NAME_POSITION, cc.macro.VERTEX_ATTRIB_POSITION);
this._program.addAttribute(cc.macro.ATTRIBUTE_NAME_COLOR, cc.macro.VERTEX_ATTRIB_COLOR);
this._program.addAttribute(cc.macro.ATTRIBUTE_NAME_TEX_COORD, cc.macro.VERTEX_ATTRIB_TEX_COORDS);
this._program.link();
this._program.updateUniforms();
}else if (cc._renderType === cc.game.RENDER_TYPE_WEBGL) {
cc.log("use webgl GLProgram");
this._program.initWithVertexShaderByteArray(_default_vert_no_mvp, _watereffect);
this._program.addAttribute(cc.macro.ATTRIBUTE_NAME_POSITION, cc.macro.VERTEX_ATTRIB_POSITION);
this._program.addAttribute(cc.macro.ATTRIBUTE_NAME_COLOR, cc.macro.VERTEX_ATTRIB_COLOR);
this._program.addAttribute(cc.macro.ATTRIBUTE_NAME_TEX_COORD, cc.macro.VERTEX_ATTRIB_TEX_COORDS);
this._program.link();
this._program.updateUniforms();
}
if (cc.sys.isNative) {
var glProgram_state = cc.GLProgramState.getOrCreateWithGLProgram(this._program);
glProgram_state.setUniformFloat( "iGlobalTime" , this.parameters.time );
}else{
this._time = this._program.getUniformLocationForName( "iGlobalTime" );
this._program.setUniformLocationWith1f( this._time, this.parameters.time );
}
this.setProgram( this.node._sgNode, this._program );
},
setProgram:function (node, program) {
if (cc.sys.isNative) {
var glProgram_state = cc.GLProgramState.getOrCreateWithGLProgram(program);
glProgram_state.setUniformTexture("u_normalMap", this.normalMapTextrue.getTexture());
node.setGLProgramState(glProgram_state);
} else if (cc._renderType === cc.game.RENDER_TYPE_WEBGL){
//this._uni_texture = program.getUniformLocationForName("u_normalMap");
//program.setUniformLocationWith1f(this._uni_texture, this.normalMapTextrue.getTexture());
//node.setShaderProgram(program);
}
let children = node.children;
if (!children) {
return;
}
for (let i = 0; i < children.length; i++)
{
this.setProgram(children[i], program);
}
},
});
module.exports = Shader_WaterEffect;