这几天在看子龙山人的关于OpenGL的文章,先依葫芦画瓢,能看到些东西,才能慢慢深入了解,当入门文章不错,但是其中遇到的一些问题,折腾了一些时间,为了方便和我一样的小白们,在这篇文章中进行写补充。

OpenGL ES2.0教程:编写自己的shader(2)--子龙山人

文章中关于VBO和VAO部分的代码的写法,我进行了些修改,将重复使用的变量定义全局变量,并修改初始化数据位置,防止在onDraw方法中重复的Malloc,致使内存泄露,具体的修改在代码注释中会说明。

源码如下:

HelloWorldScene.h

 #include "cocos2d.h"

 USING_NS_CC;

 class HelloWorld : public cocos2d::Layer

 {

 public:

   static cocos2d::Scene* createScene();

   virtual bool init() override;

   CREATE_FUNC(HelloWorld);

   virtual void visit(Renderer *renderer, const Mat4& parentTransform,   uint32_t parentFlags) override;

   void onDraw();

 private:

   CustomCommand _command;

   float _position[];

   float _color[];

   GLProgram* glProgram;

   GLuint vao;//定义VAO缓冲

   GLuint positionVBO;

   GLuint colorVBO;

   GLuint positionLocation;

   GLuint colorLocation;

 };
HelloWorldScene.cpp
 #include "HelloWorldScene.h"

 Scene* HelloWorld::createScene()
{
auto scene = Scene::create(); auto layer = HelloWorld::create(); scene->addChild(layer); return scene;
} void HelloWorld::visit(Renderer *renderer, const Mat4 &transform,uint32_t parentFlags)
{
Layer::visit(renderer, transform, parentFlags);
_command.init(_globalZOrder);
_command.func = CC_CALLBACK_0(HelloWorld::onDraw, this);
Director::getInstance()->getRenderer()->addCommand(&_command);
} void HelloWorld::onDraw()
{
//使用已经在init中初始化的glProgram
glProgram->use();
glProgram->setUniformsForBuiltins(); //获取VAO(OSX和ISO中默认开启,windows中默认不开启)
glBindVertexArray(vao); //获取VBO
glBindBuffer(GL_ARRAY_BUFFER, positionVBO);
//填充坐标数据
glBufferData(GL_ARRAY_BUFFER, sizeof(_position), _position, GL_STATIC_DRAW);
positionLocation = glGetAttribLocation(glProgram->getProgram(), "a_position");
glEnableVertexAttribArray(positionLocation);
glVertexAttribPointer(positionLocation, , GL_FLOAT, GL_FALSE, , (GLvoid*)); //获取VBO
glBindBuffer(GL_ARRAY_BUFFER, colorVBO);
//填充颜色数据
glBufferData(GL_ARRAY_BUFFER, sizeof(_color), _color, GL_STATIC_DRAW);
colorLocation = glGetAttribLocation(glProgram->getProgram(), "a_color");
glEnableVertexAttribArray(colorLocation);
glVertexAttribPointer(colorLocation, , GL_FLOAT, GL_FALSE, , (GLvoid*)); //使用VAO
glBindVertexArray(vao);
//渲染
glDrawArrays(GL_TRIANGLES, , );
//清空VAO
glBindVertexArray(); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(, );
CHECK_GL_ERROR_DEBUG();
} bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
} //准备数据
auto size = Director::getInstance()->getWinSize();
float position[] = { , , size.width, , size.width / , size.height};
float color[] = { , , , , , , , , , , , };
for (int i = ; i < sizeof(position); i++) {
_position[i] = position[i];
}
for (int i = ; i < sizeof(color); i++) {
_color[i] = color[i];
} //vert和frag文件和原文一样,直接放在Classes目录就可以读取到(环境:XCode)
glProgram = new GLProgram;
glProgram->initWithFilenames("myVertextShader.vert","myFragmentShader.frag");
glProgram->link();
glProgram->updateUniforms();
this->setGLProgram(glProgram); //glGen的系列方法会不断的Malloc内存空间,写在onDraw中会导致内存泄漏
glGenVertexArrays(, &vao);
glGenBuffers(, &positionVBO);
glGenBuffers(, &colorVBO);
return true;
}

运行结果:

Cocos2d-x中使用OpenGL ES2.0编写shader的更多相关文章

  1. Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

    原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fen ...

  2. OpenGL ES2.0 入门经典例子

    原文链接地址:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial 免责申明(必读!):本博客提供的所有教程的翻译原稿 ...

  3. OpenGL ES2.0入门详解

    引自:http://blog.csdn.net/wangyuchun_799/article/details/7736928  1.决定你要支持的OpenGL ES的版本.目前,OpenGL ES包含 ...

  4. iOS开发——图形编程OC篇&OpenGL ES2.0编程步骤

    OpenGL ES2.0编程步骤 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设 ...

  5. Android +NDK+eclipse+opengl ES2.0 开启深度測试

    參考:https://www.opengl.org/discussion_boards/showthread.php/172736-OpenGL-ES-Depth-Buffer-Problem 环境: ...

  6. OpenGL ES2.0 基本编程

    1. EGL OpenGL ES命令须要一个rendering context和一个drawing surface. Rendering Context: 保存当前的OpenGL ES状态. Draw ...

  7. OPENGL ES2.0如何不使用glActiveTexture而显示多个图片

    https://www.oschina.net/question/253717_72107 用opengl es 2.0显示多个图片的话,我只会一种方式,先将图片生成纹理,然后用下面的方式渲染 // ...

  8. OpenGL ES2.0编程三步曲 -转

    原地址:http://blog.csdn.net/myarrow/article/details/7707943 1. 保存全局变量的数据结构 以下例子程序均基于Linux平台. typedef st ...

  9. cocos2d-js Shader系列1:cocos2d-js Shader和OpenGL ES2.0

    cocos2d的Shader也就是差不多直接跟GPU打交道了,跟Flash的Stage3D(AGAL)类似,不过没有AGAL这么恶心,不需要直接编写汇编语言.而Fragment Shader又跟Fla ...

随机推荐

  1. 【log4net】配置

    第一步在 AssemblyInfo  添加如下代码 第二步:在web.config添加如下代码: <log4net> <root> <level value=" ...

  2. hibernate多对多映射关系实现

    Course.hbm.xml: <?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        &q ...

  3. javascript中五种常见的DOM方法

    getElementById将返回一个与那个有着给定id属性值的元素节点对应的对象. <html xmlns="http://www.w3.org/1999/xhtml"&g ...

  4. CS193P学习笔记(一)

    1>iOS系统分层   1.Core OS 核心操作系统层,很接近硬件的一层: 本质是一个Unix内核,使用基于BSD的Unix版本,拥有文件系统.套接字.权限等一系列Unix所具有的特性,并且 ...

  5. {dockerUI}在服务器上直接安装shipyard/shipyard

    $ git clone https://github.com/shipyard/shipyard.git $ cd shipyard/   $ sudo pip install -r requirem ...

  6. nginx命令详解

    nginx的configure命令支持以下参数: --prefix=path    定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录.默认使用 /usr/local/nginx. --s ...

  7. NOIP2012普及组 (四年后的)解题报告 -SilverN

    本章施工仍未完成 现在的时间是3.17 0:28,我困得要死 本来今天(昨天?)晚上的计划是把整个四道题的题解写出来,但是到现在还没写完T4的高效算法,简直悲伤. 尝试了用floyd写T4,终于大功告 ...

  8. 边工作边刷题:70天一遍leetcode: day 72

    Missing Range 要点:题简单,这类题的特点都是记录上一步的状态,比如这题是end 错误点: 三种情况:一是连续的,即和上一个end差1,而是中间只差1个数,没有'->',最后是大于1 ...

  9. 边工作边刷题:70天一遍leetcode: day 101

    dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d ...

  10. java 19 -15 File类批量更改文件名的方法

    /* 需求: * 把H:\三国演义下面的视频名称修改为 00?_介绍.avi 思路: A:封装目录 B:获取该目录下所有的文件的File数组 C:遍历该File数组,得到每一个File对象 D:拼接一 ...