cocos2dx opengl入门系列二-画一个三角形

来源:互联网 发布:ubuntu如何删除软件 编辑:程序博客网 时间:2024/06/06 03:55

运行环境:

mac10.12.2

xcode Version 8.2.1

cocos2dx-x-3.13.1

代码:

新建cocos2dx项目,具体操作官网有教程。新建好后,

新建Test.cpp,代码如下:

////  Test.cpp//  FirstTriangle////  Created by zhufu on 2017/3/27.////#include "Test.h"Test* Test::create(){    Test* test = new(std::nothrow) Test();    if(test && test->init())    {        test->autorelease();        return test;    }    else    {        delete test;        test = nullptr;        return nullptr;    }}bool Test::init(){    _glProgram = new GLProgram();    _glProgram->initWithFilenames("shader/myVertexShader.vsh", "shader/myFragmentShader.fsh");    _glProgram->link();    //set uniform locations    //使用此shader    _glProgram->use();                GLuint vertexVBO, colorVBO;    glGenVertexArrays(1, &_vao);    glBindVertexArray(_vao);        //创建和绑定vbo    glGenBuffers(1, &vertexVBO);    glBindBuffer(GL_ARRAY_BUFFER, vertexVBO);        GLfloat vertexData[] = {        //  X     Y     Z        0.0f, 1.0f, 0.0f,        -1.0f,-1.0f, 0.0f,        1.0f,-1.0f, 0.0f,    };    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);        //获取vertex attribute "a_position"的入口点    GLuint positionLocation = glGetAttribLocation(_glProgram->getProgram(), "a_position");    //打开入a_position入口点    glEnableVertexAttribArray(positionLocation);    //传递顶点数据给a_position,注意最后一个参数是数组的偏移了。    glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);        //set for color    glGenBuffers(1, &colorVBO);    glBindBuffer(GL_ARRAY_BUFFER, colorVBO);    float color[] = {0,1,0,1,  1,0,0,1,  0,0,1,1};    glBufferData(GL_ARRAY_BUFFER, sizeof(color), color, GL_STATIC_DRAW);        GLuint colorLocation = glGetAttribLocation(_glProgram->getProgram(), "a_color");    glEnableVertexAttribArray(colorLocation);    glVertexAttribPointer(colorLocation, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);        _command.init(_globalZOrder);    _command.func = CC_CALLBACK_0(Test::onDraw, this);        return true;}void Test::draw(Renderer *renderer, const Mat4 &parentTransform, uint32_t parentFlags){        Director::getInstance()->getRenderer()->addCommand(&_command);}void Test::onDraw(){    glClearColor(0, 0, 0, 1); // black    glClear(GL_COLOR_BUFFER_BIT);        // bind the program (the shaders)    glUseProgram(_glProgram->getProgram());    // bind the VAO (the triangle)    glBindVertexArray(_vao);        // draw the VAO    glDrawArrays(GL_TRIANGLES, 0, 3);    // unbind the VAO    glBindVertexArray(0);        // unbind the program    glUseProgram(0);}

新建Test.h,代码如下:

////  Test.h//  FirstTriangle////  Created by zhufu on 2017/3/27.////#ifndef Test_h#define Test_h#include <stdio.h>USING_NS_CC;class Test : public Node{public:    GLuint _program = 0;    virtual bool init() override;    static Test* create();    virtual void draw(Renderer *renderer, const Mat4& parentTransform, uint32_t parentFlags) override;    void onDraw();        cocos2d::CustomCommand _command;    GLProgram* _glProgram;        GLuint _vao = 0;    GLuint _vertexVBO = 0;    GLuint _colorVBO = 0;};#endif /* Test_h */

如图:


修改HelloWorldScene.cpp,

include "Test.h"


再修改CreateScene方法:

Scene* HelloWorld::createScene(){    // 'scene' is an autorelease object    auto scene = Scene::create();        auto test = Test::create();    scene->addChild(test);        // 'layer' is an autorelease object    auto layer = HelloWorld::create();    // add layer as a child to scene    scene->addChild(layer);    // return the scene    return scene;}
如图:


在Resources方位夹下新建shader文件夹,再在shader新建myVertexShader.vsh和myFragmentShader.fsh文件。

如图:



myVertexShader.vsh

attribute vec4 a_position;attribute vec4 a_color;varying vec4 v_fragmentColor;void main(){    gl_Position = a_position;    v_fragmentColor = a_color;}

myFragmentShader.fsh

varying vec4 v_fragmentColor;void main(){    gl_FragColor = v_fragmentColor;}
接下来,可以开心地运行程序了。

运行效果:


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 松下多功能传真一体机卡纸怎么办 无刷电机坏了怎么办 6kv高压电机绝缘不合格怎么办? 400t油压机下降太慢怎么办 无法连线到服务器1~1怎么办? 数控车床车角度不亮怎么办 超市存包柜的票不见了怎么办 交货期来不及导致船期延误怎么办 跑1000米中途累怎么办 手指被机器压烂怎么办 机械手不能回归原点该怎么办 前缘送纸纸板翘怎么办 三菱AL 1R.2报警怎么办 工作好但领导不好伺候怎么办 孕妇憋尿憋的小腹疼怎么办 怀孕憋尿憋的小腹疼怎么办 半夜憋尿憋的小腹疼怎么办 新生儿大便次数较多怎么办 母猎生下三天没有奶怎么办 孩孑大便干不爱喝水怎么办 发那科1050报警怎么办 plc模块bf亮了怎么办 plc模块df亮了怎么办 西门子触摸屏进不了主画面怎么办 pos机显示白屏怎么办 洗衣机的门坏了怎么办 西门子洗衣机门坏了怎么办 拆线线断在肉里怎么办 总线绝对值编码器方向反了怎么办 台达伺服报警009怎么办 台达plc禁止上传怎么办? 潜水泵电机启动绕组断线了怎么办? 永磁电机磁没了怎么办 热水器热水管坏了怎么办 松下伺服驱动器坏了怎么办 步进电机功率小了怎么办 电三轮电机坏了怎么办 电动车钢圈撞变形了怎么办 电动车后轮钢圈变形了怎么办 软油管接头渗油怎么办 一只单眼皮一只双眼皮怎么办