cocos2dx中使用GLProgramState

来源:互联网 发布:2017淘宝注册用户数 编辑:程序博客网 时间:2024/06/14 05:10

cocos2dx中GLProgram代表着色器程序,这个程序有输入也有输出,输入就是顶点属性,uniform变量的值等,输出就是显示。而GLProgramState表示的就是GLProgram和它的输入值。
这就涉及一个共享和独占的问题,如果两个sprite使用了同一个GLProgramState,那么输入设置就会相互干扰。比如下面的代码

    auto sprite1 = Sprite::create("HelloWorld.png");    addChild(sprite1);    sprite1->setPosition(visibleSize.width / 2, visibleSize.height / 2);    auto shaderState1 = GLProgramState::getOrCreateWithGLProgramName("custom");    //设置自定义uniform变量的值    shaderState1->setUniformFloat("custom", 0.2f);    sprite1->setGLProgramState(shaderState1);    auto sprite2 = Sprite::create("bang.png");    addChild(sprite2);    sprite2->setPosition(visibleSize.width / 2, visibleSize.height / 2);    auto shaderState2 = GLProgramState::getOrCreateWithGLProgramName("custom");    //设置自定义uniform变量的值    shaderState2->setUniformFloat("custom", 10.0f);    sprite2->setGLProgramState(shaderState2);

GLProgramState::getOrCreateWithGLProgramName(“custom”);返回的是同一个GLProgramState,那么对uniform变量的赋值就会相互干扰,后设置的覆盖先设置的,这时候就需要两个GLProgramState才能解决问题,更改后如下:

    auto sprite1 = Sprite::create("HelloWorld.png");    addChild(sprite1);    sprite1->setPosition(visibleSize.width / 2, visibleSize.height / 2);    auto shaderState1 = GLProgramState::create(GLProgramCache::getInstance()->getGLProgram("custom"));    //设置自定义uniform变量的值    shaderState1->setUniformFloat("custom", 0.2f);    sprite1->setGLProgramState(shaderState1);    auto sprite2 = Sprite::create("bang.png");    addChild(sprite2);    sprite2->setPosition(visibleSize.width / 2, visibleSize.height / 2);    auto shaderState2 = GLProgramState::create(GLProgramCache::getInstance()->getGLProgram("custom"));    //设置自定义uniform变量的值    shaderState2->setUniformFloat("custom", 10.0f);    sprite2->setGLProgramState(shaderState2);

这时就可以设置各自的uniform变量而不会产生干扰。

0 0