Chapter2 GPU图形绘制管线

图形管线绘制三个主要阶段

应用程序阶段

  • 高级语言实现
  • 主要和CPU,内存打交道
  • 例如:碰撞检测,场景图建立,空间八叉树更新,视锥裁剪等经典算法
  • 得到几何体数据(顶点坐标,法向量,纹理坐标,纹理等),并通过数据总线传递给图形硬件(时间瓶颈

几何阶段

  • 顶点变换,光照,裁剪,投影以及屏幕映射
  • 得到经过变换和投影之后的顶点坐标、颜色、纹理坐标

光栅阶段

  • 为像素(pixel)正确配色
  • 每个像素的信息存于颜色缓冲器(color buffer/frame buffer)

注意

涉及深度信息(Z值)的运算都是在几何阶段进行的

2.1 几何阶段

根据顶点坐标变换的先后顺序,主要有如下几个坐标空间:

  1. Object Space 物体坐标系/模型坐标空间
  2. World Space 世界坐标空间
  3. Eye Space 观察坐标空间
  4. Clip and Project Space 屏幕坐标空间

2.1.1 从Object Space 到 World Space

Ojbect Space,即物体坐标系/模型坐标系。光照计算通常发生在世界坐标系,而模型文件中的顶点法向量属于物体坐标系,必须将法向量转换到世界坐标系才可以使用。

注意:顶点坐标和法向量的转换是不同的,顶点坐标从物体坐标系转换到世界坐标系使用的是 world matrix,而法向量转换到世界坐标系中的转换矩阵是world matrix的转置矩阵,因为法向量变换的问题是由于非等比例缩放引起的,如果原来的World矩阵三个方向缩放系数相等,那么用原来的World矩阵变换法向量是没有问题的。

2.1.2 从World Space 到 Eye Space

概念

  • 视锥体:以视点或摄像机为原点,由视线方向、视角和远近平面,共同组成的一个梯形三维空间
  • 近平面:梯形体较小的矩形面
  • 远平面:梯形体较大的矩形面,投影平面
  • 视锥裁剪(Frustum Culling):在视锥体内的顶点数据是可见的,而超出部分,会被视点去除。

2.1.3 从Eye Space 到 Project and Clip Space

空间转换的裁剪过程

  1. 用透视变换吧顶点从视锥体中变换到裁剪空间的CVV中
  2. 在CVV进行图元裁剪
  3. 屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上

概念

  • 规范立方体(Canonical View Volume):裁剪被安排在一个单位立方体中进行,该立方体的对角顶点分别为(-1,-1,-1)和(1,1,1)。CVV的近平面的X,Y坐标对应屏幕像素坐标(左下角是0、0),Z坐标则代表画面像素深度。

图元位置及其对应处理方式

只有当图元完全或部分存在于视锥体内部时,才需要将其光栅化
1. 当图元完全位于视锥体内时,直接进入下一阶段。
2. 当图元完全位于视锥体外时,将被剔除
3. 当图元部分位于视锥体内时,对于部分位于视锥体内的图元进行裁剪

2.2 Primitive Assembly && Triangle Setup

概念

  • Primitive Assembly(图元装配):将顶点根据原始的连接关系(primitive)还原出网格结构。
  • 网格:网格由顶点和索引组成
  • 背面去除:一般顶点按照逆时针排列,有右手定则来确定三角面片的法向量,用于判断该面为正面还是反面,如果是反面,则要进行去除,较少绘制的顶点数目。
  • Triangle Setup:处理三角形的过程。

补充

剪裁算法有
1. 视域剔除
2. 背面剔除
3. 遮挡剔除
4. 视口剪裁

2.3 光栅化阶段

2.3.1 Rasterization

概念

  • 光栅化:决定哪些像素被集合图元覆盖的过程。

2.3.2 Pixel Operation

概念

  • Pixel Operation:又称“Raster Operation”,是在更新帧缓存前,执行最后一系列针对每个片段的操作,目的是计算出每个像素的颜色值。在这个阶段,被遮挡面被一个称为深度测试的过程消除。

Pixel Operation的过程

  1. 消除遮挡面
  2. 纹理操作(Texture Operation):根据像素的纹理坐标,查询对应的纹理值
  3. 混色(Blending):根据目前已经画好的颜色,与正在计算的Alpha值混合为两种颜色,作为新的颜色输出
  4. 滤波/滤镜(Filtering):将正在算的颜色经过某种Filtering后输出
  5. 将像素颜色写入帧缓存

2.4 图形硬件

首先来看一下GPU的存储架构:

概念

  • Z Buffer:又称”Depth Buffer”——深度缓冲区,存放的是每个像素对应顶点空间的的距离衡量,Z值范围为[0,1],默认情况下,近裁剪面上Z值为0,远裁剪面上Z值为1。Z值的比较参考 深度缓冲区算法(depth-buffer method)。Z值并不是欧几里得距离,非线性变化。
  • 模板缓冲区Stencil Buffer:通常附加在Z Buffer中,例如,15位的Z Buffer加上1位的Stencil Buffer,用来做标记,可用来表示像素对应空间点处于阴影中。
  • 帧缓冲器Frame Buffer:用于存放显示输出的数据,一般为像素颜色值。Frame Buffer有时被认为是颜色缓冲器和深度缓冲的组合。

《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记1相关推荐

  1. [你的灯亮着吗]读书笔记

    把自己当成比人:把别人当成自己:把别人当成别人:把自己当成自己 动手去解决问题之前,好好想想问题的来源 如何站在各个角度来看待面临的问题,以能够知道其真正所在:如何去尝试那个最难解决真正问题的方法,并 ...

  2. 你的灯亮着吗阅读笔记之一

    定义问题: 我们分析和解决问题时,首先要明确地定义问题.如书所云:"问题其实就是你期望的东西和你体验的东两之间的差别".我们需要搞清楚"问题是什么"和摆在你眼前 ...

  3. 你的灯亮着么阅读笔记3

    第五章问题从哪来的.我们要探寻问题的根源,而问题的根源往往出现在自身.因此我们要时常的反思自己,是否在团队中拖了后腿,而不是一味的去指责队友对自己的埋怨.只有发现自身的问题,才能改正自我. 第六章我们 ...

  4. 《你的灯亮着吗》 读书笔记三

    紧接<你的灯亮着吗>读书笔记二 4.这是谁的问题? 当别人可以妥善解决自己的问题时,不要越俎代庖,如果这是他们的麻烦,就让它成为他们的麻烦,如果一个人处于解决问题的位置,却并不受问题困扰, ...

  5. 《你的灯亮着吗》读书笔记3

    终于读完了<你的灯亮着吗>,其实从总体来看,这本书给了我很大的启示. 在理解问题之前,至少要做好准备接受三种可能的出错情况:或许还可以改变问题的表述来获得不同的解决方法:当你沉迷于寻找问题 ...

  6. 《你的灯亮着吗》读书笔记1

    你的灯亮着吗? 上帝说:"要有光."于是俺挑了这本只有50多页的书,在剩下的5天里,可以保证读完剩下的三章. 前几天我一口气看了三章,觉得这本书和<梦断代码>相比,上了 ...

  7. 《你的灯亮着吗?》读书笔记

    第3章 你的问题是什么? 问题就是理想状态和现实状态之间的差别. 噢,年轻人,你不需要自责的.等你到了我这个年纪,就知道我们在生活中重要的事情面前是多么无能为力了. 第6章 比利反思投标案 即使问题已 ...

  8. 202318读书笔记|《芭蕉·芜村·一茶:俳句三圣新译300》——樱花——让一整个春夜亮起来!

    202318读书笔记|<芭蕉·芜村·一茶:俳句三圣新译300>--樱花--让一整个春夜亮起来! <芭蕉·芜村·一茶:俳句三圣新译300>诗歌,词,短歌,俳句我都喜欢,读起来轻松 ...

  9. 读书笔记第四讲:《百万级并发商品服务架构解密》丁鸣亮

    本文是读书笔记第四讲:网易考拉海购商品中心2017年商品中心架构,百万级并发商品服务 架构解密,作者:丁鸣亮 文章目录 1.前言:电商平台的商品服务 2.考拉:商品服务的"黑历史" ...

  10. 《你的灯亮着吗》阅读笔记

    读了<你的灯亮着吗>,使我对问题的解决有了更深层次的见解.这本书告诉了我当面对问题时要发现问题的真正所在. 这本书首先提出了几个主题: 1)动手去解决问题之前,好好想想问题的来源: 2)如 ...

最新文章

  1. DataGridView打印类
  2. cocos2d游戏jsc文件格式解密,SpideMonkey大冒险
  3. Struts2 分割字符串标签s:generator
  4. 华为p4支持鸿蒙功能吗_吹过的牛都一步一步给实现了!明年华为手机支持升级鸿蒙系统!...
  5. 10.30 linux和windows互传文件,用户配置文件和密码配置文件,用户组管理,用户管理...
  6. centos出现磁盘坏掉,怎么修复和检测。
  7. python代码运行不了怎么办_selenium ide 生成的 Python 代码无法执行是怎么回事?
  8. 【计算机基础】 操作系统总结(未完)
  9. 开源组件是什么意思_一文读懂常用开源许可证
  10. golang mysql封装_自己封装的golang 操作数据库方法
  11. datatable怎么根据两列分组_公司要IT转型,我该怎么办?用Python进行数据处理
  12. 基于java的信访项目_基于JAVA的某省人大信访信息系统的设计与实现
  13. TensorFlow神经网络(七)卷积神经网络基础
  14. vs2010 “SetScrollSizes”: 找不到标识符
  15. 使用Tortoise小乌龟 git 拉取代码 报错128处理
  16. proteus元件图片_最完整的Proteus元件库元件名称及中英对照表下载
  17. (1)C# 创建控制台应用程序
  18. 2014年个人工作愿景
  19. nexus开机启动设置
  20. 【光剑藏书轩2021】5分钟读懂《贫穷的本质》:“穷人通常缺少信息来源”

热门文章

  1. Ghost XP封装教程超详细版
  2. Julia处理高斯光束的光斑图像
  3. Elasticsearch关闭自动日期检测
  4. problems encountered during text search
  5. matlab筛选excel数据统计,MATLAB读取Excel筛选符合条件的数据进行求均值等处理 程序......
  6. Chrome浏览器更新后,无法调用Lodop打印
  7. 德鲁克谈《自我管理》——《哈佛商业评论》史上最受欢迎的文章
  8. 通过python scrapy shell 获取对应的网页元素值
  9. 【毕业设计】基于大数据的招聘与租房分析可视化系统
  10. 尚学堂视频笔记三:容器