小强学渲染之OpenGL渲染管线详析
什么是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渲染管线详析的更多相关文章
- 小强学渲染之OpenGL的CPU管线
读到这里,应该对OpenGL渲染管线有了初步简单了解.下面着重分析CPU管线,即逻辑控制中心做了什么,这部分还是容易理解的.如下图: 一,将数据加载到显存中. 这是由GPU是访问显存中的数据决定的.因 ...
- 小强学渲染之OpenGL的GPU管线
GPU渲染流水线,是硬件真正体现渲染概念的操作过程,也是最终将图元画到2D屏幕上的阶段.GPU管线涵盖了渲染流程的 几何阶段 和 光栅化阶段,但对开发者而言,只有对顶点和片段着色器有可编程控制权,其他 ...
- 小强学渲染之OpenGL状态机理解
状态机是理论上的一种机器,呃这个说法非常非常的抽象.通俗一点理解,状态机描述了一个对象在其生命周期内所经历的各种状态,状态间的转变,发生转变的动因,条件及转变中所执行的活动.或者说,状态机是一种行为, ...
- 小强学渲染之Unity Shader噪声应用
之前玩Tencent的仙剑4手游时,杀死boss会看到boss有“消融”的效果,就是身体上有多个洞洞然后往四周扩散直至尸体完全消失,但效果是没有关闭背面剔除的“穿帮”效果,可能也是考虑性能因素. em ...
- 小强学渲染之Unity Shader边缘描边加强
项目开发遇到一个需求,就是当坦克的准心瞄准敌方(enemy tank 或 item box)时,要让选中的对象的轮廓高亮起来,这实际上是接下来要讲解的实时渲染中轮廓线的渲染应用.实现方式有多种,下面逐 ...
- 小强学渲染之Unity Shader编程HelloWorld
第一个简单的顶点vert/片元frag着色器 1)打开Unity 5.6编辑器,新建一个场景后ctrl+s保存命名为Scene_5.默认创建的场景是包含了一摄像机,一平行光,且场景背景是一天空盒而 ...
- OpenGL: 渲染管线理论
http://blog.csdn.net/augusdi/article/details/19934463 学习着色器,并理解着色器的工作机制,就要对OpenGL的固定功能管线有深入的了解. 首先要知 ...
- Qt的Graphics-View框架和OpenGL结合详解
Qt的Graphics-View框架和OpenGL结合详解 演示程序下载地址:这里 程序源代码下载地址:这里 这是一篇纯技术文,介绍了这一个月来我抽时间研究的成果. Qt中有一个非常炫的例子:Boxe ...
- OpenGL渲染管线(rendering pipeline)
OpenGL中的渲染管线包括:顶点着色器(vertex shader).细分着色器(里面包含两种:细分控制着色器和细分控制着色器)(tessellation shader).几何着色器.光栅化及片元着 ...
随机推荐
- NOIP2012 Day1 T2国王游戏 洛谷P1080
第一篇博客啊…… 由于我太弱了,还要去补不全的知识点准备参加人生第一次NOIp,所以第一篇博客就简短一点好了(偷懒就直说吧……) 洛谷P1080传送门 题意概括: 有N对数ai和bi,以及两个数a0和 ...
- PHP is_writeable 存在bug , 写一个自定函数 判断文件是否可写
$is_w = function($file){ if(DIRECTORY_SEPARATOR == '/' and @ini_get('safe_mode')==false){ return is_ ...
- windows tensorboard http://0.0.0.0:6006 无法访问 解决方法 - using chrome and localhost as ip
启动命令: tensorboard --logdir="tensorboard" 启动后显示 Starting TensorBoard b'47' at http://0.0.0. ...
- linux子系统搭建python3
我之前win10系统有py3,所以就没有下载,直接输入python ,就会进入python环境,但是,什么包都没有 安装pip $ wget https://bootstrap.pypa.io/get ...
- Dynamics 365 CRM large instance copy
使用CRM 大家想必都做过copy. 从一个instance 复制到另外一个instance. 如果你是Dynamics 365 CRM 用户, 并且你的instance超过500GB,甚至1TB+的 ...
- Flask--(一对多demo)作者书籍模型
一对多模型的增加和删除 后端实现: from flask import Flask from flask import flash from flask import redirect from fl ...
- 1T硬盘获3T体验 彻底解决NVR存储时间短的问题
随着高清技术的进步,现在300W和400W的IPC越来越普及,但同时带来了更多的成本及存储便利问题.“硬盘存了7天就满了”.“同样大小的硬盘,存储时间越来越短”......为啥你的NVR不能存更长的时 ...
- 【fork/join】java并发编程-fork/join示例
package com.chinamobile.epic.tako.common.graphite.query.sync.impl; import com.google.common.collect. ...
- 【剑指offer】广度优先遍历二叉树
问题:从上往下打印出二叉树的每个节点,同层节点从左至右打印. *思路:先用队列存放树的根结点.每次出队一个结点,将结点非空的左右孩子分别入队.重复此过程,直到队列为空. import java.uti ...
- PUSU 拆分后发货和开票的时间节点问题
项目做到现在业务突然说流程要变,心中顿时无数个草草草掠过.这公司业务也真是够奇葩了,一天一个样.原来流程是由PU把产品生产完后就发给SU,由SU再来决定什么时候对客户和开票.而现在马上要上线了,突然冒 ...