什么是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. JS 验证字符串是否为空

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

  2. oracle-rman-3

    http://blog.csdn.net/leshami/article/details/6032525 rman概述及体系结构 http://blog.itpub.net/23513800/view ...

  3. Java 的 volatile 修饰符

    volatile 修饰符,用于多线程同步 volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值.而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存.这 ...

  4. java:try...catch...finally

    try...catch...finally 规则: 可以没有 finally 块 如果没有 catch 块,则必须跟一个 finally 块 当在 try 块或 catch 块中遇到 return 语 ...

  5. 函数和对象 及 prototype和__proto__

    对象有  __proto__ 函数有 prototype 对象的__proto__指向构造自己的函数的prototype 但有一例外 var Obj = {v:99}var pObj = Object ...

  6. 代码回滚:Reset、Checkout、Revert的选择

    代码回滚:Reset.Checkout.Revert的选择 Git仓库有三个主要组成——工作目录,缓存区和提交历史. 从图中我们可以看出,缓存区或者叫索引,其实是指一整套即将被下一个提交的文件集合.也 ...

  7. JavaBean是什么,POJO是什么

    参考:https://stackoverflow.com/questions/3295496/what-is-a-javabean-exactly https://stackoverflow.com/ ...

  8. centos 使用RPM包安装指定版本的docker-engine

    下面是拿安装docker-engine-1.10.3-1为例: wget https://yum.dockerproject.org/repo/main/centos/7/Packages/docke ...

  9. UEFI和GPT下硬盘克隆后的BCD引导修复

    UEFI和GPT下硬盘克隆后的BCD引导修复-Storm_Center http://www.stormcn.cn/post/1901.html 当硬盘引导换成GPT,系统启动也变成UEFI后,如果直 ...

  10. redis5.0.4 集群搭建

    准备工作用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-5.0.4 版本. 两台虚拟机都是 CentOS ,一台 CentOS ...