• 其实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. Dom4j quick start guide

    Parsing XML Using Iterators Powerful Navigation with XPath Fast Looping Creating a new XML document ...

  2. hdu 5663 Hillan and the girl 莫比乌斯反演

    Hillan and the girl Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/O ...

  3. Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论

    题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...

  4. spring boot: Annotation 注解之@Target的用法介绍

    前言 目前,越来越多的架构设计在使用注解,例如spring3.0.struts2等框架.让我们先来看看注解的定义.如下是一段使用了JDK 5 Annotation @Target的代码: @Targe ...

  5. phalcon: 开启模板缓存和缓存路径

    /** * 设置view */ $di->set('view', function () use ($config) { $view = new \Phalcon\Mvc\View(); $vi ...

  6. 2017-03-04 dotnet core网站发布到Linux系统中

    今天开始学习dotnet core的开发,距离Visual Stuio 2017正式版的发布,也就是VS20周岁的生日还有三天,在我的电脑上安装的是VS2017 Enterprise RC版, 在VS ...

  7. ICollectionView

    引自:http://www.cnblogs.com/Joetao/articles/2168577.html ICollectionView让MVVM更简单   (一)ICollectionView的 ...

  8. JS中的“use strict” 严格模式

    1.介绍严格模式 2.严格模式影响范围 变量:  var.delete.变量关键字 对象: 只读属性. 对象字面量属性重复申明 函数:参数重名.arguments对象.申明 其他:this.eval. ...

  9. Tomcat部署项目后有括号的处理方法

    常见的问题,收录整理了一下,方便查找. 如下3个地方都修改为一致即可解决. 1,右键项目名 --> properties --> 输入web project settings --> ...

  10. xss攻击的分类

    1.反射型XSS 原理: 通过在页面上植入恶意链接,诱使用户点击,执行js脚本,所谓反射型XSS就是将用户输入的数据(恶意用户输入的js脚本),“反射”到浏览器执行. 实例: php源码: <? ...