creator 版本: 1.42
如题,先上代码:
frag:
`
#ifdef GL_ES
precision mediump float;
#endif
uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
void main( void ) {
// vec2 resolution = iResolution.xy;
// float time = iGlobalTime;
vec2 position = ((gl_FragCoord.xy / resolution.xy) * 2. - 1.) * vec2(resolution.x / resolution.y, 1.0);
float d = abs(0.3 + length(position) - 0.5 * abs(sin(time))) * 20.0;
vec3 cir = vec3(0.1/d, 0.1 / d, 0.2 / d);
vec3 bcol = vec3(1.0,0.8,0.7-0.07*position.y)*(1.0-0.25*length(position));
float r = length(position);
vec3 color = mix(bcol,cir,smoothstep(0.0,1.0,r));
gl_FragColor = vec4(color,1.0);
}
`
vert:
attribute vec4 a_position; attribute vec2 a_texCoord; attribute vec4 a_color; varying vec2 v_texCoord; varying vec4 v_fragmentColor; void main() { gl_Position = CC_PMatrix * a_position; v_fragmentColor = a_color; v_texCoord = a_texCoord; }
这是shadertoy测试的结果,是预期的结果:
但是在creator 加到精灵上之后如下如,一直显示在左下角,并没有被显示在精灵里面
这是creator中的精灵:
我还测试了一些在纹理上的特效,如模糊等,都是正常的,也就是传入的纹理坐标系是没问题的,但是单纯的用gl_FragCoord来计算做出来的动画就不是预期现实的效果。
我先请教各位怎么能让我画的东西在固定大小的精灵里面,这个是不是坐标矩阵转换有问题?望解答,感谢!
下面是js脚本:
var _default_vert = require("…/Shaders/ccShader_Default_Vert.js");
var _default_vert_no_mvp = require("…/Shaders/ccShader_Default_Vert_noMVP.js");
cc.Class({
extends: cc.Component,
properties: {
glassFactor:1.0,
flagShader:"",
frag_glsl:{
default:"Effect10.fs.glsl",
visible:false,
}
},
onLoad: function () {
var self = this;
this.parameters={
startTime:Date.now(),
time:0.0,
mouse:{
x:0.0,
y:0.0,
},
resolution:{
x:0.0,
y:0.0,
}
};
this.node.on(cc.Node.EventType.MOUSE_MOVE, function (event) {
this.parameters.mouse.x = this.node.getContentSize().width / event.getLocationX();
this.parameters.mouse.y = this.node.getContentSize().height / event.getLocationY();
}, this);
this.node.on( cc.Node.EventType.TOUCH_MOVE, function (event) {
this.parameters.mouse.x = this.node.getContentSize().width / event.getLocationX();
this.parameters.mouse.y = this.node.getContentSize().height / event.getLocationY();
}, this);
cc.loader.loadRes(self.flagShader,function(err,txt){
if(err){
cc.log(err)
}else{
self.frag_glsl = txt;
self._use();
}
});
},
update:function(dt){
if(this.glassFactor>=40){
this.glassFactor=0;
}
this.glassFactor+=dt*3;
if(this._program){
this._program.use();
this.updateGLParameters();
if(cc.sys.isNative){
var glProgram_state = cc.GLProgramState.getOrCreateWithGLProgram(this._program);
glProgram_state.setUniformVec2( "resolution", this.parameters.resolution );
glProgram_state.setUniformFloat( "time", this.parameters.time );
glProgram_state.setUniformVec2( "mouse" , this.parameters.mouse );
}else{
this._program.setUniformLocationWith2f( this._resolution, this.parameters.resolution.x,this.parameters.resolution.y );
this._program.setUniformLocationWith1f( this._time, this.parameters.time );
this._program.setUniformLocationWith2f( this._mouse, this.parameters.mouse.x,this.parameters.mouse.x );
}
}
},
updateGLParameters(){
this.parameters.time = (Date.now() - this.parameters.startTime)/1000;
this.parameters.resolution.x = ( this.node.getContentSize().width );
this.parameters.resolution.y = ( this.node.getContentSize().height );
},
_use: function()
{
if (cc.sys.isNative) {
cc.log("use native GLProgram");
this._program = new cc.GLProgram();
this._program.initWithString(_default_vert_no_mvp, this.frag_glsl );
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();
this.updateGLParameters();
}else{
this._program = new cc.GLProgram();
this._program.initWithVertexShaderByteArray(_default_vert_no_mvp, this.frag_glsl );
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();
this._program.use();
this.updateGLParameters();
this._program.setUniformLocationWith1f( this._program.getUniformLocationForName('time'), this.parameters.time );
this._program.setUniformLocationWith2f( this._program.getUniformLocationForName('mouse'), this.parameters.mouse.x,this.parameters.mouse.y );
this._program.setUniformLocationWith2f(this._program.getUniformLocationForName('resolution'), this.parameters.resolution.x,this.parameters.resolution.y );
}
if (cc.sys.isNative) {
var glProgram_state = cc.GLProgramState.getOrCreateWithGLProgram(this._program);
glProgram_state.setUniformVec2( "resolution", this.parameters.resolution );
glProgram_state.setUniformFloat( "time" , this.parameters.time );
glProgram_state.setUniformVec2( "mouse" , this.parameters.mouse );
}else{
this._resolution = this._program.getUniformLocationForName( "resolution" );
this._time = this._program.getUniformLocationForName( "time" );
this._mouse = this._program.getUniformLocationForName( "mouse" );
this._program.setUniformLocationWith2f( this._resolution, this.parameters.resolution.x,this.parameters.resolution.y );
this._program.setUniformLocationWith1f( this._time, this.parameters.time );
this._program.setUniformLocationWith2f( this._mouse, this.parameters.mouse.x,this.parameters.mouse.y );
}
this.setProgram( this.node._sgNode ,this._program );
},
setProgram:function (node, program) {
if (cc.sys.isNative) {
var glProgram_state = cc.GLProgramState.getOrCreateWithGLProgram(program);
node.setGLProgramState(glProgram_state);
}else{
node.setShaderProgram(program);
}
var children = node.children;
if (!children)
return;
for (var i = 0; i < children.length; i++)
this.setProgram(children[i], program);
}
});




