cocos2dx中shader的CC_Time的使用

cocos2dx为shader提供了3个跟时间有关的uniform变量

const char* GLProgram::UNIFORM_NAME_TIME = "CC_Time";
const char* GLProgram::UNIFORM_NAME_SIN_TIME = "CC_SinTime";
const char* GLProgram::UNIFORM_NAME_COS_TIME = "CC_CosTime";

赋值为

 if (_flags.usesTime) {
        // This doesn't give the most accurate global time value. // Cocos2D doesn't store a high precision time value, so this will have to do.
        // Getting Mach time per frame per shader using time could be extremely expensive.
        /*程序运行时间*/
        float time = _director->getTotalFrames() * _director->getAnimationInterval();

        setUniformLocationWith4f(_builtInUniforms[GLProgram::UNIFORM_TIME], time/10.0, time, time*2, time*4);
        setUniformLocationWith4f(_builtInUniforms[GLProgram::UNIFORM_SIN_TIME], time/8.0, time/4.0, time/2.0, sinf(time));
        setUniformLocationWith4f(_builtInUniforms[GLProgram::UNIFORM_COS_TIME], time/8.0, time/4.0, time/2.0, cosf(time));
    }

time是程序启动到现在经历的秒数
CC_Time 赋值为time/10.0, time, time*2, time*4
CC_SinTime 赋值为time/8.0, time/4.0, time/2.0, sinf(time)
CC_CosTime 赋值为time/8.0, time/4.0, time/2.0, cosf(time)

使用这些uniform变量,可以产生一些随时间变化的动画效果

const char* vert = R"( attribute vec4 a_position; attribute vec2 a_texCoord; varying vec2 v_texCoord; void main() { gl_Position = CC_PMatrix * a_position; v_texCoord = a_texCoord; } )";

const char* frag = R"( varying vec2 v_texCoord; void main() { vec4 col = texture2D(CC_Texture0, v_texCoord); gl_FragColor = col*CC_SinTime.w; gl_FragColor.a = col.a; } )";
GLProgram* p = GLProgram::createWithByteArrays(vert, frag);
GLProgramCache::getInstance()->addGLProgram(p, "time");

auto sprite = Sprite::create("HelloWorld.png");
addChild(sprite);
sprite->setPosition(visibleSize.width / 2, visibleSize.height / 2);
auto shaderState = GLProgramState::getOrCreateWithGLProgramName("time");
sprite->setGLProgramState(shaderState);

这个shader可以使图片随时间产生忽明忽暗的动画效果

你可能感兴趣的:(cocos2d-x)