什么是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. C# 利用反射完成计算器可扩展功能

    一个主要的窗体程序,两个输入框,一个label using System; using System.Collections.Generic; using System.ComponentModel; ...

  2. webpack 中,importloaders 配置项的含义

    importLoaders:用于配置「css-loader 作用于 @import 的资源之前」有多少个 loader. 0 => no loaders (default); 1 => p ...

  3. Jenkins入门-环境搭建(1)

    因为Jenkins的环境搭建比较简单,本来不想来介绍,但是发现有些入门小朋友,从各种网站上下载的各种安装包来搭建,最后导致出现了各种千奇百怪的问题,介于这种情况下我决定还是来写一下Jenkins的环境 ...

  4. [转]Linux下Python与C++混合编程

    转自:http://www.cnblogs.com/tevic/p/3645197.html 最近在做一个CUDA的项目,记录下学习心得. 系统 Linux 3.11.0-19-generic #33 ...

  5. Ext.NET Grid Group分组使用

    - 需要注意的是, 涉及到分页排序, 最好定义GroupDir 方向与分组方式相同. - 譬如工资表按照最新最前分页输出. 如果分组按照默认排序的话, 最就最前. - 界面呈现出2015年, 2016 ...

  6. 03-封装BeanUtil工具类(javabean转map和map转javabean对象)

    package com.oa.test; import java.beans.BeanInfo; import java.beans.IntrospectionException; import ja ...

  7. 一个简单SpringBoot例子

    一:为什么使用springBoot: 有利于开发(整合框架,例如整合了springMVC,Mybatis等框架); 启动无需配置tomcat(java应用程序运行,实际以jar包运行),内置tomca ...

  8. android 开发 View _15 导入一张图片将它裁剪成圆形 与 paint图层叠加处理详解

    方法一: /* 实现思维是这样的: 1.首先拿到bitmap图片 2.得到bitmap图片的高度 宽度,并且计算好各个画图尺寸 3.创建一个空白的 bitmap图片: Bitmap output = ...

  9. Django文件存储(一)默认存储系统

    Django默认使用的文件存储系统'django.core.files.storage.FileSystemStorage'是一个本地存储系统,由settings中的DEFAULT_FILE_STOR ...

  10. py库: GUI(tkinter)

    图形用户界面(Graphical User Interface,简称 GUI) http://www.runoob.com/python/python-gui-tkinter.html Python ...