Cocos OpenGL/ES学习之一—你好,三角形(1)概览

cocos 版本为3.13.1,后续可能会根据cocos版本的升级变的不同。 本篇基于cocos引擎,使用OpenGL/ES实现一个三角形。 先看一下效果图: triangle 函数声明:

//函数声明
//重载父类函数
virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags) override;
//自定义绘图函数
void onDraw(const cocos2d::Mat4& transform, uint32_t flags);

函数实现:

void Triangle::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
 \_customCommand.init(\_globalZOrder, transform, flags);
 \_customCommand.func = CC\_CALLBACK_0(Triangle::onDraw, this, transform, flags);
 renderer->addCommand(&_customCommand);
}


void Triangle::onDraw(const Mat4& transform, uint32_t flags)
{
 //获取程序对象
 auto glProgram = getGLProgram();
 //设置为活动程序
 glProgram->use();
 //设置统一变量(通过API传送给着色器源码的只读常量)
 glProgram->setUniformsForBuiltins();

 auto winSize = Director::getInstance()->getWinSize();
 //顶点坐标
 float vertercies\[\] = { 0, 0
 ,winSize.width, 0,
 winSize.width / 2, winSize.height };
 //顶点颜色
 float color\[\] = { 1, 0, 0, 1,
 0, 1, 0, 1,
 0, 0, 1, 1 };

 //启用position和color的vertex attribute
 GL::enableVertexAttribs(GL::VERTEX\_ATTRIB\_FLAG\_POSITION | GL::VERTEX\_ATTRIB\_FLAG\_COLOR);

 //glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,const GLvoid * pointer):加载顶点数据
 //index:顶点属性的索引值
 //size:每个顶点属性的组件数量。必须为1、2、3或者4。初始值为4。(如position是由3个(x,y,z)组成,而颜色是4个(r,g,b,a))
 //type:顶点的数据类型
 //normalized:是否归一化
 //stride:顶点属性之间的偏移量
 //pointer:指定第一个组件在数组的第一个顶点属性中的偏移量
 glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_POSITION, 2, GL\_FLOAT, GL\_FALSE, 0, vertercies);
 glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_COLOR, 4, GL\_FLOAT, GL\_FALSE, 0, color);

 //glDrawArrays (GLenum mode, GLint first, GLsizei count):绘制三角形
 //mode:GL\_POINTS、GL\_LINES、GL\_LINE\_LOOP、GL\_LINE\_STRIP、GL\_TRIANGLES、GL\_TRIANGLE\_STRIP、GL\_TRIANGLE_FAN
 //first: 9
 //count: 3
 glDrawArrays(GL_TRIANGLES, 0, 3);
 //添加draw batches和顶点数目
 CC\_INCREMENT\_GL\_DRAWN\_BATCHES\_AND\_VERTICES(1, 3);
 //检测是否产生错误,如果有打印错误信息
 CHECK\_GL\_ERROR_DEBUG();
}

初始化:

bool Triangle::init()
{
    bool ret = false;
    do
    {
        CC\_BREAK\_IF(false == TestCase::init());

        char vShaderStr\[\] =
            "attribute vec4 a_position;                    \\n"
            "attribute vec4 a_color;                    \\n"
            "varying vec4 v_fragmentColor;                \\n"
            "void main()                                \\n"
            "{                                            \\n"
            "   gl\_Position = CC\_MVPMatrix * a_position;\\n"
            "    v\_fragmentColor = a\_color;                \\n"
            "}                                            \\n";

        char fShaderStr\[\] =
            "varying vec4 v_fragmentColor;                \\n"
            "void main()                                \\n"
            "{                                          \\n"
            "   gl\_FragColor = v\_fragmentColor;            \\n"
            "}                                          \\n";

        // init shader
        //auto glProgram = GLProgram::createWithFilenames("Shaders/vert.vsh", "Shaders/frag.fsh");
        auto glProgram = GLProgram::createWithByteArrays(vShaderStr, fShaderStr);
        auto state = GLProgramState::getOrCreateWithGLProgram(glProgram);
        setGLProgramState(state);

        ret = true;
    } while (0);

    return ret;
}

通过上面的代码及设置,就可以使用自定义的Shader了。在下一篇中对上面的代码进行一下分析。 示例程序开源托管在Github: CocosShader


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 xue_huashan@163.com

文章标题:Cocos OpenGL/ES学习之一—你好,三角形(1)概览

文章字数:633

本文作者:max-xue

发布时间:2016-12-14, 11:27:00

最后更新:2019-11-09, 21:35:13

原始链接:http://blog.le-more.com/2016/12/14/cocos/ef-bc-8c-e4-b8-89/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏