• 其实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. volatile的特性

    volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这 ...

  2. API是什么?——回答:接口。(待)

    基础打不够啊,一句话问倒我.第一反应是像java,matlab之类的api,下个小文件,然后安装到电脑上,可以很方便的查看一些东西. 但是一般公司的对外api不可能做的像java这样,还专门提供一个可 ...

  3. FreeTDS-SQL Server在linux和unix下的免费驱动

    微软为MS SQL Server的连接和使用提供了很好的 驱动和 文档. 不幸的是,那只能在windows操作系统上使用. 所以对于Linux或者Unix,您需要寻找不同的方法来连接MS SQL Se ...

  4. Windods7+Anaconda+Tensorflow安装步骤

    1.下载及安装Anaconda Anaconda是python科学计算的集成.下载Anaconda,下载地址:http://continuum.io/downloads. 由于tensorflow目前 ...

  5. Handsontable-一款仿 Excel效果的表格插件使用总结 96

    最近在做一个关于报表管理的项目,发现了一款很好用的jQuery插件-Handsontable.它真的特别给力,在 Excel 中可进行的操作,你几乎都可以在网页中做到,如拖动复制.Ctrl+C .Ct ...

  6. axios 拦截 , 页面跳转, token 验证(自己摸索了一天搞出来的)

    最近做项目,需要登录拦截,验证.于是使用了axios的拦截器(也是第一次使用,摸索了1天,终于搞出来了,真是太高兴啦!!!),废话不多说,直接上代码, 项目结构:vue-cli + webpack + ...

  7. Spring_总结_03_装配Bean(二)_Java配置

    一.前言 本文承接上一节:Spring_总结_03_装配Bean(一)之自动装配 上一节提到,装配Bean有三种方式,首先推荐自动装配.当自动装配行不通时,就需要采用显示配置的方式了. 显示配置有两种 ...

  8. nyoj-1278-Prototypes analyze(二叉排序树模板)

    题目链接 思路:建树之后,判断有多少种不同的树. 判断不同的树,简单的思路是遍历数组,判断数组后面是否存在一样的树 /* Name:NYOJ-1278-Prototypes analyze Copyr ...

  9. Knuth-Morris-Pratt 算法

    KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法).KMP算法的关键是利用匹配 ...

  10. LeetCode Find Mode in Binary Search Tree

    原题链接在这里:https://leetcode.com/problems/find-mode-in-binary-search-tree/#/description 题目: Given a bina ...