什么是OpenGL? OpenGL是一套图形硬件的软件API接口库,它直接和GPU交互,将3D场景渲染绘制到2D屏幕上。总结说,OpenGL的功能是将程序中定义的各种2D或3D模型绘制到帧缓存中,或者将数据从帧缓存中读取的程序中,如保存一张场景截图。 当今大多数移动平台手游引擎都采用OpenGL ES进行绘制,游戏场景界面是由一组组UI元素堆构而成的,引擎内部通过对OpenGL接口的封装,将这些UI元素转化为一系列OpenGL命令的调用(如一Sprite精灵渲染画到屏幕上要调用一系列的绘制指令),并在每一帧中将场景绘制到设备屏幕上。这一过程依赖CPU和GPU共同作用。

  那如何理解CPU客户端和GPU服务端呢? CPU,即串行处理器如手机CPU处理器便是逻辑部分的控制中心,一个手游app运行渲染所需要的逻辑数据由CPU负责。而GPU,即并行的图形处理器,负责接收处理CPU传递过来的渲染指令,最终绘制图元到屏幕上。 也就是说,CPU和GPU之间的通信,便形成了这么一条opengl渲染管线,下面详细分析。

  

  上图简单总结了OpenGL的管线过程,即客户端程序通过调用OpenGL API,将顶点/片段着色器,顶点数组等数据,以及GL状态参数(如是否混合等)传入GL服务端,然后在客户端调用drawCall绘制指令,到这里位置CPU管线便完成。然后,GL服务端会对输入的图元逐一执行GPU渲染管线的每个阶段,将结果写入到帧缓冲,最后将帧缓冲的颜色值显示到屏幕上。代码的详细实现可以参考Cocos引擎中精灵类的绘制实现-CCSprite的draw函数,在这里只提取部分:

void CCSprite::draw(void)
{if (!checkVisibility()){return;}... ... ...ccGLBlendFunc( m_sBlendFunc.src, m_sBlendFunc.dst );        //设置混合函数
ccGLBindTexture2D( m_pobTexture->getName() );               //绑定纹理ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex ); //开启顶点属性#define kQuadSize sizeof(m_sQuad.bl)
#ifdef EMSCRIPTENlong offset = 0;setGLBufferData(&m_sQuad, 4 * kQuadSize, 0);
#elselong offset = (long)&m_sQuad;
#endif // EMSCRIPTEN//绑定顶点/纹理坐标,颜色// vertexint diff = offsetof( ccV3F_C4B_T2F, vertices);glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));// texCoodsdiff = offsetof( ccV3F_C4B_T2F, texCoords);glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));// colordiff = offsetof( ccV3F_C4B_T2F, colors);glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));//drawCall通知GPU绘制glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); ... ... ...
}

  实际上,渲染管线可以分两方面理解,即CPU流水线和GPU流水线,可以分别参考下《小强学渲染之OpenGL的CPU管线》和《小强学渲染之OpenGL的GPU管线》。

  上面简单总结了一下自己的学习笔记,因为自己也才自学OpenGL大概一个多月的时间,所以可能存在不准确的地方,希望有不足之处多多包涵,大家共同学习交流一起进步~

转载于:https://www.cnblogs.com/pyqLoner/p/8478943.html

小强学渲染之OpenGL渲染管线详析相关推荐

  1. OpenGL 渲染管线理论

    这几天稍微看了一些关于GLSL的顶点着色以及片元着色的一些相关知识.目前来讲还有一个着色器则是Geometry_shader..我的显卡用不了这个功能..当然有点遗憾>_<..       ...

  2. 《OpenGL编程指南(原书第9版)》——1.4 OpenGL渲染管线

    1.4 OpenGL渲染管线 OpenGL实现了我们通常所说的渲染管线(rendering pipeline),它是一系列数据处理过程,并且将应用程序的数据转换到最终渲染的图像.图1-2所示为Open ...

  3. OpenGL: 渲染管线理论

    学习着色器,并理解着色器的工作机制,就要对OpenGL的固定功能管线有深入的了解. 零.首先要知道几个OpenGL的术语 渲染(rendering):计算机根据模型(model)创建图像的过程. 模型 ...

  4. OpenGL 渲染管线理论

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 学习着色 ...

  5. OpenGL纹理详解

    OpenGL纹理详解 现实生活中,纹理最通常的作用是装饰我们的物体模型,它就像是贴纸一样贴在物体表面,使得物体表面拥有图案.但实际上在OpenGL中,纹理的作用不仅限于此,它可以用来存储大量的数据,一 ...

  6. Android openGl开发详解(二)

    https://zhuanlan.zhihu.com/p/35192609 Android openGl开发详解(二)--通过SurfaceView,TextureView,GlSurfaceView ...

  7. Android openGl开发详解(二)——通过SurfaceView,TextureView,GlSurfaceView显示相机预览(附Demo)

    最近公司在做自定义相机这一块,之前使用的是第三方,后来需求变更,第三方不支持添加动态贴纸,所以只能自己扩展.当然网上有很多例子,但是关于添加动态贴纸的例子几乎找不到,反正我是没找到(欲哭无泪).当然, ...

  8. OpenGL渲染管线之简单示例(五)

    前言:这一章我们将对前面的所有知识进行实践,通过OpenGL编程,完成一个简单的OpenGL程序.你可以通过访问我的GitHub获取我学习的HelloOpenGL项目.这个项目需要的所有头文件及库均配 ...

  9. opengl渲染管线(Graphics Pipeline)

    opengl渲染管线 前言:在OpenGL中,任何事物都在3D空间中,但是屏幕和窗口都是2D像素数组,因此OpenGL大部分工作都是将3D坐标转化为适应屏幕的2D像素.3D坐标转化为2D坐标的过程是O ...

最新文章

  1. C#实现微信AES-128-CBC加密数据的解密
  2. Delphi 与 DirectX 之 DelphiX(52): TDIB.DoSaturation();
  3. 【Netty】Netty 入门案例分析 ( Netty 模型解析 | Netty 服务器端代码 | Netty 客户端代码 )
  4. 4.1 Tensorflow:卷积函数
  5. MySQL存储结构的使用
  6. Hadoop分布式文件系统--HDFS结构分析
  7. 3D 相机halcon算子,持续更新
  8. 修改图片src_【学习园地】企业SRC搭建
  9. 将多个Celery定时任务添加到Systemd
  10. 网上订单管理-新增、修改
  11. [Objective C] 获取类和对象的运行时状态
  12. 机器学习面试- Scikit-learn
  13. JavaSE学习--HTML
  14. slub分配流程-kmem_cache_alloc函数
  15. 提取MapInfo地图数据中的空间数据解决方案
  16. java ssh 连接mysql数据库_Java通过ssh连接访问数据库
  17. 中国移动中兴ZTE F623光猫设置自动拨号启用wifi功
  18. 数据结构——二叉树错题集
  19. mysql创建管理员账户
  20. “插座”,“充电宝”,“数据线”用英语怎么说?

热门文章

  1. python训练营免费领取-21天训练营丨Python量化投资打卡第五期!学完押金全返!...
  2. python编程语言的缺点-常见的AI编程语言优缺点比较,程序员千万不要入错行!...
  3. python画简单图片-Python绘制“高颜值”桑基图
  4. python笔记基础-Python基础教程学习笔记-1
  5. python面向对象编程的优点-Python语言有哪些优点?
  6. 想学python从哪里入手-想要学习python,如何入手学习?
  7. pythonweb开发-Web | 浅谈用Python进行Web开发
  8. 零基础可以学python吗-零基础适合学习python吗?
  9. 学会python爬虫怎么赚钱-学会Python爬虫能赚大钱吗?Python爬虫赚钱渠道分享
  10. 学python可以做什么职业好-业余学Python能做什么?对职业发展有什么帮助?