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

  

  简单总结GPU管线,这阶段中主要是对图元进行操作。首先,将由应用阶段加载到显存中的顶点数据(由drawCall指定后)作为输入传递给顶点着色器。接着,顶点着色器首先对图元的每个顶点设置模型视图变换及投影变换(即右乘MVP矩阵),然后将变换后的顶点按照摄像机视椎体定义(即透视投影,或正投影)进行裁剪,将不在视野内的顶点去掉并剔除某些三角面片。最后到几何阶段的屏幕映射,负责把修改过的图元的坐标转换到屏幕坐标系中(即投影到屏幕上)

  到光栅化阶段,这一阶段主要目的是将每个图元转换为多个片段,并生成多个片段的位置,由片段着色器负责计算每个片段的颜色值。同时,在这阶段片段着色器通常会要求输入纹理,从而对每个片段进行着色贴图。每个片段在被发送到帧缓冲区之前,还会经历一些操作,这些操作可能会修改片段的颜色值,其中包括深度测试,模板测试,像素所有权测试,与当前缓冲区相同位置颜色混合等等。

  最后,帧缓冲区内容被交换到屏幕进行显示。

  下面会对各个阶段每个知识点进行详细的分析理解。

  一,顶点着色器。顶点着色器是一段类似C语言的程序(即OpenGL的GLSL,或只支持微软的HLSL,或Unity的Cg),由程序员提供并在GPU上执行,对每个顶点都执行一次运算。顶点着色器可以使用顶点数据来计算改顶点的坐标,颜色,光照和纹理坐标等。在渲染管线中,每个顶点都独立的被执行。原因在于顶点着色器本身不能创建或删除顶点,也无法得到顶点与顶点之间的关系,如无法知道两个顶点是否属于同一个三角网格。正因这独立性,GPU可以并行化处理每一个顶点,提高处理速度

  顶点着色器最重要的功能是执行顶点的坐标变换和逐顶点光照。坐标变换是改变顶点的位置,把顶点坐标从模型空间转换到齐次裁剪空间(即将本地坐标系转换为裁剪坐标系)。通过改变顶点位置可以实现很多酷炫的shader效果,如模拟水面,布料等等,这里后面添加实例学习例子再详细说明。 顶点着色器的另一功能是向后续阶段的片段着色器提供一组易变(Varying)变量,用于插值计算

  二,图元装配。在顶点着色器程序输出顶点坐标之后,各个顶点按照绘制命令(DrawArrays或DrawElements)中的图元类型参数顶点索引数组被组装成一个个图元,并对其进行如下图的图元操作:

  

  裁剪,处于视椎体以外的图元将被丢弃,若该图元与视椎体相交则会发生裁剪产生新图元,如下图:

              

  注意一点,透视裁剪是比较影响性能的过程,因为每个图元都需要和6个裁剪面进行相交计算并产生新图元。所以一般在x轴,y轴超出屏幕(由glViewPort定义)的部分,这些顶点在视口变换的时候被更高效的直接丢弃,无须产生新图元。

  视椎体在OpenGL中可以通过gluPerspective来定义对应的大小结构,在Cocos2dx引擎中,Director类的setProjection方法就定义了cocos的渲染用到的视椎体,大家可以阅读对应的代码了解学习下。

  经过视椎体裁剪后的顶点坐标经过透视分离(指由硬件做透视除法),得到范围是[0,1]的归一化的设备坐标,最后映射到屏幕或者视口上。

  【补充:CC_MVPMatrix是一个mat4类型的uniform,在shader代码被编译之前,由cocos2d-x框架插进来的。3D物体从建模到最终显示到屏幕上面要经历以下几个阶段:

  • 对象空间(Object Space)
  • 世界空间(World Space)
  • 照相机空间(Camera Space)
  • 裁剪空间(Clipping Space)
  • 视口空间(Viewport)  

  从对象空间到世界空间的变换叫Model-To-World变换,从世界空间到照相机空间的变换叫World-To-View变换,而从照相机空间到裁剪空间的变换叫做View-To-Projection。gl_Position = P * MV * ObjectPosition; 合起来,即常提到的MVP变换。】

  三,片段着色器。【先补充一点,其实在光栅化之前,要判断图元的朝向,是面向还是背对观察者,以决定是否需要丢弃图元。在OpenGL可通过glFrontFace指令来决定哪个方向为正,并通过glCullFace决定需要保留哪一面(别忘了要先打开剔除状态设置才可以调用指令 glEnable(GL_CULL_FACE);)。这样设计的好处是能减少一些不必要的绘制,并减少对GPU的浪费。】  回到正题,片段着色器同上述的顶点着色器,只是它作用的对象是每一片段,对其进行着色贴图。片元着色器的输入是根据那些从顶点着色器中输出的数据插值得到的,其中最重要的渲染技术之一是纹理采样。在顶点着色器阶段输出每一顶点对应的纹理坐标,然后经过光栅化阶段对三角网格的3个顶点各自纹理坐标进行插值运算后便得到其覆盖片元的纹理坐标,从而在片元着色器中进行纹理采样。如下图:

  

  四,逐片元操作。这里篇幅原因不一一分析每种测试操作,大家可以通过看书了解对应的用途。下面举混合操作来分析一下。下图是简化流程图:

  

  对于不透明的物体,可以直接关闭混合Blend操作,这样片元着色器计算得到的颜色值直接覆盖更新缓冲区的颜色值。但对于半透明物体就必须开启使用混合操作从而让物体看起来是透明的。开发过程中无法得到透明效果的原因,往往有可能是没有开启混合功能的原因。

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

小强学渲染之OpenGL的GPU管线相关推荐

  1. 小强学渲染之OpenGL渲染管线详析

    什么是OpenGL? OpenGL是一套图形硬件的软件API接口库,它直接和GPU交互,将3D场景渲染绘制到2D屏幕上.总结说,OpenGL的功能是将程序中定义的各种2D或3D模型绘制到帧缓存中,或者 ...

  2. OpenGL:使用FBO为渲染对象并从GPU取出存图

    OpenGL 使用FBO为渲染对象并从GPU取出存图的代码 #include "gl/glew.h" #include "gl/glut.h" #include ...

  3. OpenGL调用GPU(七)

    1.首先看三个设备节点 <1>.基于CPU的framebuffer /dev/fb0<2>.基于GPU的framebuffer /dev/graphics/fb0<3&g ...

  4. Chromium硬件加速渲染的OpenGL命令执行过程分析

    在Chromium中,由于GPU进程的存在,WebGL端.Render端和Browser端的GPU命令是代理给GPU进程执行的.Chromium将它们要执行的GPU命令进行编码,然后写入到一个命令缓冲 ...

  5. 视图渲染、CPU和GPU卡顿原因及其优化方案

    视图渲染过程: 1.CPU 计算好显示内容提交到 GPU 2.GPU 渲染完成后将渲染结果放入帧缓冲区 3.视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示 ...

  6. Boost:在OpenCL并将图像渲染为OpenGL中的纹理

    Boost:在OpenCL并将图像渲染为OpenGL中的纹理 实现功能 C++实现代码 实现功能 Boost的compute模块,在OpenCL并将图像渲染为OpenGL中的纹理 C++实现代码 #i ...

  7. python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...

    问题引入 在小强学Python+OpenCV之-1.4.2裁剪一节,我们使用的是numpy数组切片功能实现图片区域的裁剪. 那么,如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,使用掩 ...

  8. OpenGL EGL GPU工作流程理解(十四)

    基本概念 1.OpenGL ES :OpenGL是一套绘图函数的标准,OpenGL|ES是OpenGL中针对嵌入式系统的一套函数子集. 2.EGL:通俗上讲,OpenGL是一个操作GPU的API,它通 ...

  9. matlab图片渲染,MATLAB图渲染:OpenGL与Painters?

    当涉及哪个渲染器用于MATLAB数字或什么时候重要时,我无能为力,但我遇到了一些重要的例子: plot(0,0,'ko','markersize',50,'linewidth',8); set(gcf ...

  10. OpenGL教程一,窗体和图形的渲染(包含OpenGL、GLFW、GLAD)

    运行环境:Linux .C++ 本教程仅个人学习总结 第一个hello world,渲染一个窗体 渲染一个矩形 本教程仅个人学习总结 一切参考资源:都在官网. 1.安装glfw 首先下载glfw : ...

最新文章

  1. 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)
  2. (十三)Hibernate高级配置
  3. 【新功能】MaxCompoute禁止Full Scan功能开放 1
  4. 北京这些5平米不到的外卖窗口,居然能够排起100米以上的长龙!
  5. 论文Attention-guided CNN for image denoising解读
  6. Arduino 实现八段数码管显示练习
  7. LINUX使用C调用LMDB的方法
  8. 数据结构——顺序表 SqList *L 和 SqList * L的区别
  9. 网络规划 网络工程 用户需求分析 网络结构设计
  10. GPS测量中四参数、七参数的概念及意义
  11. pearson相关系数_pearson相关系数与典型相关性分析(CCA)
  12. 【干货】针对DNN的神经网络中上下文相关处理的连续学习概述
  13. 论我是如何被自己搭建的聊天机器人气死的(自己的搞笑经历)
  14. jQuery动画效果——淡入淡出
  15. html 限制每行字数,毕业论文每行字数的设置
  16. 快看世界公布“神笔马良”工程 国漫借AI技术走向世界
  17. 各类网线的有效传输距离
  18. 微信小程序入门7-微信公众号设置IP白名单
  19. Cortex-A55核心板的温升实测!
  20. 关于Android状态栏反色(白底黑字)的适配小总结

热门文章

  1. Ubuntu 禁用Guest用户
  2. 房地产开发商崩盘样本:楼盘捂了两年,欠40亿巨债
  3. Flink电商指标分析项目(1)_项目整体工程搭建
  4. 解决InfoPath 2007表单的部署问题
  5. [计算机毕业设计]数字水印算法
  6. 社会工程学利用的人性_社会互程学利用的人性“弱点”
  7. A component is changing an uncontrolled input to be controlled. This is likely caused by the value
  8. 生命礼赞,带动世界第三次文化复兴伊比利亚双雄篇
  9. 计算机音乐修炼爱情,林俊杰/于竞超/苏阳/陈蓝杰《修炼爱情 (Live)》[FLAC/MP3-320K]...
  10. 关乎未来40年企业生存,这些食品饮料巨头都在干这件事儿! | 商研局 Cool Business...