• 【玩转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

  • 相关阅读:
    自定义Hooks:四个典型的使用场景
    FreeSql的各种工程demo上新啦
    萌新看过来,你还学不懂VScode插件吗?
    项目7加法运算前后端分离AspNetMvcApi&Vue实现
    张高兴的 Entity Framework Core 即学即用:(一)创建第一个 EF Core 应用
    task5
    Day09参数+递归
    K8S原来如此简单(四)Service+Ingress
    别再写一堆的 for 循环了!Java 8 中的 Stream 轻松遍历树形结构,是真的牛逼!
    task23
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5184151.html
Copyright © 2020-2023  润新知