• 其实OpenGL的流水线,对我学习来说只能算是一个概念性的东西。毕竟OpenGL也在发展,流水线也不会是一成不变的。
  • 不过理解流水线的过程,重点在于理解每一步的作用,进而可以如何衔接起来,完成整个绘制图像的工作。顺序不一定相同,但仍能完成工作,但效率上肯定会有差。

状态机

  • 在OpenGL中,我们输入的总是

    • “顶点”
  • 但同时我们也会改变许多 
    • “状态”
  • 比如 
    • 当前顶点颜色glColor
    • 当前顶点的法向量glNormal
    • 当前相机的位置、朝向、正向gluLookAt
    • 作用于当前 顶点 的旋转、平移、缩放效果
    • ……
  • 所以我们叫OpenGL是一个状态机,因为你输入的每一个顶点数据,在那一行代码的时刻就有各种各样的状态对应着这个顶点,而这个顶点也必须经过这些状态的变化后,才是最终你所希望绘制的顶点

流水线的工作过程

  • 所以我们有了什么?

    • 世界坐标系下的一堆顶点数据
    • 每个顶点所对应的各种状态变量
    • 其他内容如视景体、视口……
  • 想象一下如何生成最后的图像  
    • 对于顶点,我们需要把各种状态作用在上面,比如你设置的颜色、光照模型下这个顶点应该是什么颜色、进行的旋转等变换、顶点相对于相机的坐标、如果有透视效果会让顶点的坐标发生偏转,,,,,,之后才算一个真正的顶点
    • 对于这些点,我们还需要确定这些顶点构成了怎样的图形,OpenGL里成为图元,如这三个顶点的含义是一个三角形,那四个是一个四边形,,,,,,这些信息就需要装配起来,否则顶点只是一个点,组成图形后才有更深的意义
    • 对于图元,我们进一步根据你设置的视景体(三维的区域,只有区域内部才会被用来生成图像)来进行裁剪,剩下的图元就是要用来生成图像的,只是这个时候数据都是连续的数学抽象表达,而图像却是离散的像素点
    • 所以,我们进一步进行光栅化(也叫扫描转换),确实每一个图元对应了哪些像素。比如一条线段只有两个顶点的数据,两个顶点会至少各占一个像素的位置,但是这条线段要连续,就要让这条线段进一步占用两个顶点之间的像素的位置。于是我们得到了一个个像素的数据,OpenGL里称之为片段或片元
    • 但这些像素尚不能作为最终的图像的像素,进一步的片段处理会根据是否有纹理贴图进一步修改像素的颜色、对于三维空间中的物体的遮挡关系根据某种方法只显示在前面的物体、是否需要对锯齿效果进行反走样等等……
  • 大概就是这样


细说流水线

其实我也只是学了很少的内容而已,不过作为一个简单的理解入门还是勉强够格的

    • 顶点处理

      • 坐标

        • 齐次坐标表示
        • 坐标系 
          • 世界坐标系
          • 相机坐标系
          • 裁剪坐标系
      • 模型视图矩阵  
        • 模型变换矩阵

          • 旋转矩阵
          • 平移矩阵
          • 缩放矩阵
        • 视图矩阵 
          • 相机的位置、朝向、正向
          • 视图矩阵
      • 投影矩阵  
        • 视景体
        • 透视投影矩阵
        • 正交投影矩阵
      • 光照模型  
        • 光照分析

          • 光源类型
          • 材质类型
        • Phong光照模型
        • Blinn-Phong光照模型
    • 裁剪  
      • 线段裁剪算法

        • Cohen-Sutherlend算法
        • Sutherland-Hodgeman算法
      • 多边形裁剪算法 
        • Sutherland-Hodgeman算法
    • 光栅化(扫描转换) 
      • 线段扫描转换

        • DDA 数字微分分析器
        • Bresenham算法
      • 多边形扫描转换 
        • 内外点检测算法

          • 凸多边形
          • 奇偶检测
          • 环绕数
        • 填充算法  
          • 种子算法
          • 扫描线算法  
            • 新边表
            • 活动边表
    • 片段处理 
      • 隐藏面消除

        • 对象空间算法
        • 画家算法
        • 深度排序  
          • 简单
          • 复杂
        • 背向面剔除(多边形拣选)
        • 图像空间算法
        • 深度缓存ZBuffer

OpenGL渲染流水线的更多相关文章

  1. Unity Shader入门精要学习笔记 - 第2章 渲染流水线

    来源作者:candycat   http://blog.csdn.net/candycat1992/article/ 2.1 综述 渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏 ...

  2. Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd

    前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...

  3. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  4. OpenGL渲染流程

    一.什么是openGL OpenGL被定义为“图形硬件的一种软件接口”.从本质上说,它是一个3D图形和模型库,具有高度的可移植性,具有非常快的速度. 二.管线 管线这个术语描述了opengl渲染的整个 ...

  5. 初始化glew,创建OpenGL渲染上下文

    void RegisterWinDowClass(HINSTANCE hInstance,std::string className,WNDPROC proc) { WNDCLASS wndClass ...

  6. 移动端 像素渲染流水线与GPU Hack

    什么是 像素渲染流水线 web页面你所写的页面代码是如何被转换成屏幕上显示的像素的.这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤: 1.JavaScript:一般来说,我们会使用JavaS ...

  7. 一个使用openGL渲染的炫丽Android动画库二(碎片化曲面动画)

    续一个使用openGL渲染的炫丽Android动画库 MagicSurfaceView v1.1.0发布, 新增碎片化曲面动画 地址:https://github.com/gplibs/android ...

  8. Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线

    渲染流水线 1)应用阶段(CPU处理) 首先,准备好场景数据(摄像机位置,视锥体,模型和光源等) 接着,做粗粒度剔除工作. 最后,设置好每个模型的渲染状态(使用的材质,纹理,shader等) 这一阶段 ...

  9. 关于QT Graphics View开启OpenGL渲染后复选框、微调框等无法正常显示的问题

    之前学习QT Graphics View框架,除了基本的图元外,还可以通过QGraphicsProxyWidget类添加QT的基本Widget(如按钮.复选框.单选框等),常使用的场景类接口如下: Q ...

随机推荐

  1. EntityFramework 学习 一 Execute Native SQL Query

    SQL query for entity types: using (var ctx = new SchoolDBEntities()) { var studentList = ctx.Student ...

  2. windows编译hadoop 2.x Hadoop-eclipse-plugin插件

    本文转载至:http://blog.csdn.net/congcong68/article/details/42098391 一.简介 Hadoop2.x之后没有Eclipse插件工具,我们就不能在E ...

  3. UVA 1638 Pole Arrangement (dp)

    题意:有n个长度为1到n的柱子排列在一起,从左边看有l根从右边看有r根,问你所以排列中满足这种情况的方案数 题解:就是一个dp问题,关键是下标放什么,值代表什么 使用三维dp,dp[i][j][k]= ...

  4. iphone的一些坑

    1.<div contenteditable></div>需要添加css user-select: text;才能输入. 2.css属性animation一直存在,添加了-we ...

  5. Qt5.3.2_vs10_发布时所需DLL的路径

    1. ???\Qt5.3.2_vs2010\5.3\msvc2010_opengl\bin 2.

  6. 开启 cmd cmder 代理

    win10安装了ShadowSocks软件,浏览器通过代理后就可以***,但有时候需要通过cmd科学下载安装一些组件,就需要设置一下cmd的代理 cmd如果要设置代理的话,需要在执行其他命令之前,先执 ...

  7. web自动化:selenium原理和元素定位(一)

    一. Selenium2 WebDriver 当Selenium2.x提出了WebDriver的概念后,它提供了完全另外的一种方式与浏览器交互 那就是利用浏览器原生的API,封装成一套更加面向对象的S ...

  8. ViewPager渲染背景颜色渐变(引导页)--第三方开源--ColorAnimationView

    下载地址:https://github.com/TaurusXi/GuideBackgroundColorAnimation 使用方法如下: <FrameLayout xmlns:android ...

  9. SMB/CIFS协议简介

    1. 简介:(ServerMessage Block)服务消息块通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议.SMB从I ...

  10. poj-1426-Find The Multiple(打表水过)

    思路: 2的最近可以整除的数是10 所以,很关键的一点,只要是偶数,例如: 6:2*3,可以拆分为能够被2整除和能够被3整除的乘积,所以,10*111=1110 144:72*2,8*9*2,2*2* ...