cocos2D-X源码分析之从cocos2D-X学习OpenGL(18)----实例化

原创 2016年06月15日 14:02:36

       cocos2d-x中的batchNode的方式可以提高相同的纹理的渲染效率,但是它使用的绘制方式还是glDrawElements的方式,它只是把相同的纹理的绘制命令只提交一次,剩下的重复绘制都调用glDrawElements即可,当绘制中的一些参数变化时,使用glMapBuffer获得数据的指针,然后修改数据,代码如下:

glBufferData(GL_ARRAY_BUFFER, sizeof(_quads[0]) * _capacity, nullptr, GL_DYNAMIC_DRAW);
void *buf = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
memcpy(buf, _quads, sizeof(_quads[0])* _totalQuads);
glUnmapBuffer(GL_ARRAY_BUFFER);
       把数据传进缓冲的这个方式是向内存请求一个指针,调用glMapBuffer函数openGL会返回当前绑定的内存地址,然后需要调用glUnmapBuffer函数可以告诉openGL已经用完指针了,这是一个解映射的操作。

       另外一个被注释掉的方式就是调用glBufferSubData:

glBufferSubData(GL_ARRAY_BUFFER, sizeof(_quads[0])*start, sizeof(_quads[0]) * n , &_quads[start] );
       glBufferSubData填充特定区域的缓冲而不是填充整个缓冲,第二个参数就是要被填充的缓冲的其实偏移值。

       openGL其实提供了一种更高效的方式,就是实例化的方式。实例化也称多实例渲染,是一种连续执行多条相同的渲染命令的方法,并且每个渲染命令所产生的结果都会有轻微的差异,这是一种非常有效的,使用少量API调用大量几何体的方法。openGL已经提供了一些常用的绘制函数的多变量形式来优化命令的多次执行。
       实例化是一种只调用一次渲染函数却能绘制出很多物体的技术,它节省了渲染一个物体是cpu到gpu的通讯时间,对应glDrawArrays和glDrawElements,有两个实例化绘制函数glDrawArraysInstanced和glDrawElementsInstanced,这两个函数需要多传一个实例化数量的参数,它设置我们打算渲染实力的数量,这样我们只需要把所需要的数据发给gpu一次,然后告诉gpu该如何使用这个参数绘制这些实例。

        对应的在着色器中,我们可以拿到一个内置变量-gl_Instance来知道当前绘制到第几个了

glBindVertexArray(quadVAO);
glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 100); 
glBindVertexArray(0);
        cocos2d-x中的batchNode部分其实可以用实例化的方式重构一下,提高效率。


        下一篇将介绍几种旋转的表示方法

         能力不足,水平有限,如有错误,欢迎指出。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Cocos2d-x中图字原理之深入分析

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier]   红孩儿Cocos2d-X学习园地QQ群:24994195...

Cocos2d-X游戏工具开发之一:将Cocos2d-X嵌入MFC的子窗体方法讲解

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier]   红孩儿Cocos2d-X学习园地QQ群:24994195...

Cocos2d-x 的“HelloLua” 深入分析

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier]   红孩儿Cocos2d-X学习园地QQ群:24994195...

Cocos2d-x 的“HelloWorld” 深入分析

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier]   红孩儿Cocos2d-X学习园地QQ群:24994195...

如何利用Cocos2d-x开发一个游戏?

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957 ...

VS2005也能运行Cocos2d-x

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957 ...

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第十步---发射子弹&怪物受伤---所有源码和资源完结下载

好吧,到这一步,整个游戏基本上弄完啦,由于自己的水平也就这样.....重写的过程中很多细节处理的不好。 游戏中很多地方都留下了可扩充的代码,可是时间方面有点不够。。。而且也没美工 本次笔记内容: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)