zoukankan      html  css  js  c++  java
  • 【玩转cocos2d-x之四十】怎样在Cocos2d-x 3.0中使用opengl shader?

    有小伙伴提出了这个问题。事实上GLProgramCocos2d-x引擎自带了。全然能够直接拿来用。

    先上图吧。

    使用opengl前后的对照:


    1.在cpp中使用openGL shader。

    (1)加入gray.vsh和gray.fsh到资源文件夹(见附件)。
    (2)加入例如以下代码:

    bool HelloWorld::init()
    {
        if ( !Layer::init() )
        {
            return false;
        }
        ize visibleSize = Director::getInstance()->getVisibleSize();
        auto sprite = Sprite::create("HelloWorld.png");
        sprite->setAnchorPoint(Point(0.5, 0.5));
        sprite->setPosition(Point(visibleSize.width / 3, visibleSize.height / 3));
        this->addChild(sprite);
        graySprite(sprite);
        return true;
    }
     
    void HelloWorld::graySprite(Sprite * sprite)
    {
        if(sprite)
        {
            GLProgram * p = new GLProgram();
            p->initWithFilenames("gray.vsh", "gray.fsh");
            p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);
            p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);
            p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);
            p->link();
            p->updateUniforms();
            sprite->setShaderProgram(p);
        }
    }

    2.在js中使用opengl shader.

    (1)加入gray.vsh和gray.fsh到资源文件夹。


    (2)加入例如以下代码:

    var HelloWorldLayer = cc.Layer.extend({
        sprite:null,
        ctor:function ()
        {
            this._super();
            var size = cc.director.getWinSize();
            this.sprite = cc.Sprite.create(res.HelloWorld_png);
            this.sprite.attr({
                x: size.width / 2,
                y: size.height / 2,
                scale: 0.5,
                rotation: 180
            });
            this.addChild(this.sprite, 0);
            graySprite(this.sprite);                       
            return true;
        }
    });
     
    function graySprite(sprite)
    {
        if(sprite)
        {
            var shader = new cc.GLProgram();//cc.GLProgram.create("gray.vsh", "gray.fsh");
            shader.retain();
            //shader.initWithByteArrays("res/gray.vsh", "res/gray.fsh");
            shader.initWithFilenames("res/gray.vsh", "res/gray.fsh");
            shader.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
            shader.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
            shader.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
     
            shader.link();
            shader.updateUniforms();
            sprite.setShaderProgram(shader);
        }    
    }

    附件:gray.vsh和gray.fsh
    翻译自:
    1.http://www.cocos2d-x.org/forums/6/topics/49035
    2.http://www.cocos2d-x.org/forums/19/topics/49038

  • 相关阅读:
    深拷贝与浅拷贝
    图片旋转插件
    promise 小抄
    github fork项目更改后与原作者同步更新
    eslint 的配置
    css规范
    Object类
    BigIntager
    System类
    Math类和Random类
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5184151.html
Copyright © 2011-2022 走看看