什么是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 EMSCRIPTEN
    ;
    setGLBufferData(&m_sQuad,  * kQuadSize, );
#else
    long offset = (long)&m_sQuad;
#endif // EMSCRIPTEN

    //绑定顶点/纹理坐标,颜色
    // vertex
    int diff = offsetof( ccV3F_C4B_T2F, vertices);
    glVertexAttribPointer(kCCVertexAttrib_Position, , GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));

    // texCoods
    diff = offsetof( ccV3F_C4B_T2F, texCoords);
    glVertexAttribPointer(kCCVertexAttrib_TexCoords, , GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));

    // color
    diff = offsetof( ccV3F_C4B_T2F, colors);
    glVertexAttribPointer(kCCVertexAttrib_Color, , GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));

    //drawCall通知GPU绘制
    glDrawArrays(GL_TRIANGLE_STRIP, , ); 

    ... ... ...
}

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

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

小强学渲染之OpenGL渲染管线详析的更多相关文章

  1. 小强学渲染之OpenGL的CPU管线

    读到这里,应该对OpenGL渲染管线有了初步简单了解.下面着重分析CPU管线,即逻辑控制中心做了什么,这部分还是容易理解的.如下图: 一,将数据加载到显存中. 这是由GPU是访问显存中的数据决定的.因 ...

  2. 小强学渲染之OpenGL的GPU管线

    GPU渲染流水线,是硬件真正体现渲染概念的操作过程,也是最终将图元画到2D屏幕上的阶段.GPU管线涵盖了渲染流程的 几何阶段 和 光栅化阶段,但对开发者而言,只有对顶点和片段着色器有可编程控制权,其他 ...

  3. 小强学渲染之OpenGL状态机理解

    状态机是理论上的一种机器,呃这个说法非常非常的抽象.通俗一点理解,状态机描述了一个对象在其生命周期内所经历的各种状态,状态间的转变,发生转变的动因,条件及转变中所执行的活动.或者说,状态机是一种行为, ...

  4. 小强学渲染之Unity Shader噪声应用

    之前玩Tencent的仙剑4手游时,杀死boss会看到boss有“消融”的效果,就是身体上有多个洞洞然后往四周扩散直至尸体完全消失,但效果是没有关闭背面剔除的“穿帮”效果,可能也是考虑性能因素. em ...

  5. 小强学渲染之Unity Shader边缘描边加强

    项目开发遇到一个需求,就是当坦克的准心瞄准敌方(enemy tank 或 item box)时,要让选中的对象的轮廓高亮起来,这实际上是接下来要讲解的实时渲染中轮廓线的渲染应用.实现方式有多种,下面逐 ...

  6. 小强学渲染之Unity Shader编程HelloWorld

    第一个简单的顶点vert/片元frag着色器   1)打开Unity 5.6编辑器,新建一个场景后ctrl+s保存命名为Scene_5.默认创建的场景是包含了一摄像机,一平行光,且场景背景是一天空盒而 ...

  7. OpenGL: 渲染管线理论

    http://blog.csdn.net/augusdi/article/details/19934463 学习着色器,并理解着色器的工作机制,就要对OpenGL的固定功能管线有深入的了解. 首先要知 ...

  8. Qt的Graphics-View框架和OpenGL结合详解

    Qt的Graphics-View框架和OpenGL结合详解 演示程序下载地址:这里 程序源代码下载地址:这里 这是一篇纯技术文,介绍了这一个月来我抽时间研究的成果. Qt中有一个非常炫的例子:Boxe ...

  9. OpenGL渲染管线(rendering pipeline)

    OpenGL中的渲染管线包括:顶点着色器(vertex shader).细分着色器(里面包含两种:细分控制着色器和细分控制着色器)(tessellation shader).几何着色器.光栅化及片元着 ...

随机推荐

  1. 第三章 jQuery总结 参考文本

    jQuery jQuery是javascript的一个函数库,非常方便,非常主流 利用jQuery开发步骤: 1导入jQuery库 2在$(function(){})的{}中编写jQuery代码 ①j ...

  2. xpython在Windos下的安装及简单的文本打开、保存

    前几天写自动化部署脚本,用的是paramiko和shell相结合,paramiko可是实现ssh登录,文件及文件夹的上传下载,这些功能,然后一直想自己写个东西出来,于是就想把这些功能我把他放到图形化界 ...

  3. docker之 网络模式和跨主机通信

    Docker的四种网络模式Bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0... Docker的四种网络模式 Bridge模式 当Docker进程启动时,会在主机上创建 ...

  4. OkHttp官方中文文档

    https://blog.csdn.net/jackingzheng/article/details/51778793 https://www.cnblogs.com/ldq2016/p/879630 ...

  5. 黄聪:什么是XSS攻击

    XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏洞旁路掉访问控制——例如同源 ...

  6. tinycc update VERSION to 0.9.27

    TinyCC全称为Tiny C Compiler, 是微型c编译器,可在linux/win/平台上编译使用. 在用代码里面使用tcc当脚本,性能比lua还快,目前已有网游服务端使用TCC脚本提高性能. ...

  7. 【比赛打分展示双屏管理系统-专业版】Other.ini 配置文件解读以及排行榜界面及专家评语提交展示等具体配置

    第一个问题:Other.ini配置文件的解读: 在软件根目录下,找到Other.ini配置文件,打开如下: 配置文件解读: iOrderIDOrXSID:默认为0,按照软件 选项/排行榜和奖项 的设置 ...

  8. HTML翻转菜单练习

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Redis管理:安全/耗时命令日志与命令监控/数据库管理工具

    1.安全管理 1)绑定指定IP Redis的安全设计是在“Redis运行在可信环境”这个前提之下的,在生产环境中建议通过应用程序连接Redis.Redis可以配置只接受来自指定IP的的请求,可通过修改 ...

  10. python-web自动化-元素定位

    # -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By # ...