分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
里面有些公式和矩阵无法在电脑上书写, 故用纸笔记录了一些笔记, 比如公式的推算, 注意要点等. 由于电子书是黑白图, 不好理解, 所以弄了彩色配图上来
Chapter 1 Introduction
1. 实时渲染---图像在计算机上快速的显示
2. 15fps --- 实时渲染的基本fps. 72fps以及更大的fps观察者无法发现其中的差别 60fps 对反应时间来说太小了, 只有15ms的时间用于用户反映.
3. 实时渲染的三个条件: 互动, 三维空间, 图形加速
1.1 Contents Overview
4. 各章节介绍
Chapter 2 The Graphics Rendering Pipeline: 实时渲染的核心概念
Chapter 3 The Graphics Processing Unit: 现代GPU使用固定功能单元和可编程单元实现渲染管线的各个阶段
Chapter 4 Transform
Chapter 5 Visual Appearance: 材质和光照, 反锯齿, gamma修正
Chapter 6 Texturing
Chapter 7 Advanced Shading 正确表现材质和点光源的理论和实践
Chapter 8 Area and Environmental Lighting
Chapter 9 Global Illumination 阴影, 反射, 折射算法, 辐射, 光线追踪, 预处理光照, 环境封闭
Chapter 10 Image-Based Effect: lens flares, fire, motion blu, ....
Chapter 11 Non-Photorealistic Rendering: cartoon shading
Chapter 12 Polygonal Techniques: 讨论多边形数据, 并优化和简化其数据
Chapter 13 Curves and Curved Surfaces
Chapter 14 Acceleration Algorithms: culling 和 LOD渲染的不同形式
Chapter 15 Pipeline Optimization 发现和解决瓶颈
Chapter 16 Intersection Test Methods 相交检测
Chapter 17 Collision Detection 碰撞检测
Chapter 18 Graphics Hardware 颜色深度, 帧缓存, 基本结构体类型, 一些有代表性的图形加速器研究
Chapter 19 The Future
1.2 Notation and Definitions (记号和定义)
向量使用列向量格式
v = {x, y, z, 0} 表示向量, v = {x, y, z, 1} 表示一个点
Chapter 2 The Graphics Rendering Pipeline
Bresenham's line-drawing algorithm[142], symmetric double-step algorithm[1391]
渲染管线的速度取决于管线中最慢的环节, 无论其他的环节速度多快
粗略的将实时渲染管线划分为三个环节: application, geometry, rasterizer
概念环节(application, geometry, rasterizer) conceptual stages, 功能环节 functional stages, 管线环节 pipeline stages的区别
功能环节 ---- 执行特定的task, 不管如何在管线中实现
管线环节 ---- 和其他的管线环节同步
也许多个功能环节合并成一个管线环节, 也许一个功能环节分割成多个管线环节
两个用来表示渲染速度的方式: fps 和 Hertz(Hz)
例子: 计算渲染速度
假设输出设备的最大更新频率为 60 Hz, 渲染管线的瓶颈环节已经发现, 为62.5ms.
渲染速度的最大值为 1/0.0625 = 16fps
60/1 = 60Hz, 60/2 = 30Hz, 60/3 = 20Hz, 60/4 = 15Hz, 60/5 = 12Hz
15Hz 是小于16fps之下的最大值, 所以最后预计渲染速度为15fps.
application stage --- 运行于 CPU, 常处理 碰撞检测, global acceleration algorithm, 动画, 物理模拟以及其他
geometry stage --- 通常使用GPU, 常处理 transforms, projections
rasterizer stage --- 渲染前面生成的图像, 完全在GPU上处理.
2.2 The Application Stage
开发者可完全控制该阶段
为了提供性能, 在多核处理器上平行运算, superscalar construction. 见15.5介绍的利用多核处理器的方法
该阶段常处理碰撞检测. 处理输入(键盘, 鼠标, ...), 纹理动画. 以及其他阶段不会执行的计算.例如 Chapter 14 介绍的 hierarchical view frustum culling.
2.3 The Geometry Stage
处理大部分的顶点和多边形操作.分为以下几个功能环节: model and view transform, vertex shading, projection, clipping, screen mapping
模型转换后, 模型处于世界空间/世界坐标系中.
视图转换, 让相机处于原点, 且朝向为z负轴, 向上的方向为y轴, x轴为向右.
确定材质上光照效果的操作为 shading. 其包含在对象的顶点上计算 shading equation. 该计算有一部分在geometry环节执行, 另一部分在每个像素的光栅化(rasterization)执行, 存储在每个顶点上的一系列材质数据如位置, 发现, 颜色以及其他用于计算shading equation的信息. Vertex shading的结果发送给rasterization环节进行插值. (结果可为颜色, 向量, 纹理坐标以及其他类型的shading数据)
Shading 计算通常在世界空间中进行, 实际上, 为了方便有时转换相关实体(如相机和光源)到其他的空间(模型或视觉空间), 并在该空间进行计算.`
这是由于光源, 相机和模型的相对关系在转换至其他空间时仍会保持相同的相对关系.
shading之后就是执行 projection, 主要将视图锥转换至一个单元立方体, 范围为[-1, -1, -1]到[1, 1, 1]. 该单元立方体称为 canonical view volume.
两种projection方法: 正交和透视投影
投影之后, 模型位于 normalized device coordinates.投影之后, z坐标春处于 z缓存(深度缓存)中.
对部分在视图锥之内, 部分在视图锥之外的图元进行裁剪,
用户可以定义额外的裁剪平面. 在可编程处理单元(programmable processing units)进行
裁剪环节和屏幕映射环节(screen mapping stage)通常有固定操作硬件处理.
screen mapping环节, 将裁剪坐标x,y转换成屏幕坐标.
像素整数值和浮点值之间的关系: 一个像素的中心坐标为(0.5, 0.5), 所以像素范围[0, 9]可取值[0.0, 10.0)
Opengl将左下角的坐标作为最小值, DX将左上角的坐标作为最小值
2.4 The Rasterizer Stage
光栅化 --- 计算和设置绘制对象的像素颜色. 将屏幕空间中的二维顶点(带z值)以及每个顶点关联的各种shading信息转换至屏幕上的像素.
Rasterizer stage 划分为几个功能环节: triangle setup, triangle traversal, pixel shading, merging
triangle setup --- 计算三角形表面的差异和其他数据. 这些数据用于 scan conversion和各种各样shading数据的插值, 由固定操作硬件完成该功能.
triangle traversal --- 检查一些像素, 这些像素的中心点被三角形所覆盖. 并生成用于三角形上像素的片段.
查找在三角形之内的样本(sample)或像素的操作成为 triangle traversal 或 scan conversion.
通过三角形三个顶点的数据插值生成三角形片段(fragment)的性质. 这些性质包括片段的深度以及有geometry环节生成的shading 数据
Pixel shading --- 每个像素的shading计算, 输入数据为shading数据的插值结果, 输出数据为一个或多个颜色.该环节由可编程GPU来执行.
pixel shading环节可运用许多技术, 其中最重要的为texturing, 即将图片粘贴至模型上
Merging环节 --- 将shading环节产生的片段颜色和存储在color buffer里的颜色组合起来, 执行该环节的GPU子单元并非可完全编程的. 但其可进行各种配置, 实现各种效果.
Merging 环节还解决对象是否可视问题, 当渲染整个场景之后, 颜色缓存应当存储相机视图在该点可见图元的颜色. 对大多数图形硬件来说, 这点是由 Z-buffer 算法完成. 每个像素存储距离相机最近图元的z值,
Z-buffer算法可以以任意顺序渲染大多数图元, 然而对于半透明图元则不能够任意顺序绘制, 必须绘制所有不透明图元之后, 以back-to-front顺序绘制.
除了 Z-buffer, color buffer缓存, 还有 alpha channel, 可进行 alpha test.在 depth test之前进行. 该测试的典型用法是确保完全透明的fragment不会影响到 Z-buffer.
stencil buffer --- 记录渲染图元的位置, 每个像素八位数据.使用不同的函数图元渲染至stencil buffer.并且buffer的内容可用于控制是否渲染至color buffer 和 Z-buffer.
accumulation buffer -- 累积缓存.使用一系列操作对图像进行累积. 例如通过平均和累积图像可以生成 motion blur., 其他效果如 depth of field, antialiasing, soft shadow, etc.
double buffer --- 在 back buffer 进行渲染, 而后和 front buffer进行交换, 在 vertical retrace(真扫描)时进行交换.
2.5 Through the Pipeline
想象一个互动的CAD应用程序, 用户检查一个移动手机的设计, 透视投影. 手机模型有线条(边缘), 有三角形(表面), 有纹理(显示键盘和屏幕). 在 geometry 环节计算 shading, 除了纹理部分, 该部分在 rasterization 环节发生.
Application 环节: 设置旋转矩阵进行手机翻盖操作, 设置相机以不同的位置和视角来浏览手机, 形成一个动画.
Geometry 环节 --- 模型矩阵和视图矩阵结合成模型视图矩阵, 将对象所有的顶点和法线转换至视图空间, 计算顶点的shading, 使用材质和光源属性.执行投影, 转换对象之单元立方体空间. 而后进行裁剪. 将顶点映射至屏幕上的窗口. 最后进行光栅化
Rasterizer 环节 --- 所有的图元进行光栅化, 转换成为窗口上的像素.进行纹理操作, 通过Z-buffer算法查看对象的可视性, 还有alpha测试, stencil 测试等.
Conclusion
offline rendering pipelines 也有不同的发展, 用于电影产品的渲染常使用 micropolygon pipelines,
本书默认使用可编程功能管线,
Further Reading and Resources
A Trip Down the Graphics Pipeline.
Chapter 3 The Graphics Processing Unit
相对于软件, 专用硬件可以提高速度
渲染管线的GPU实现: Vertex Shader()->Geometry Shader()-->Clipping(*)-->Screen Mapping(&)-->Trangle Setup(&)-->Triangle Traversal(&)-->Pixel Shader()-->Merger(**)
(*) 表示可完全编程的环节
(**) 表示可配置但不可编程的环节
(&) 表示完全固定功能的环节
3.1 GPU Pipeline Overview
vertex shader是完全可编程环节, 处理"Model and View Transform", "Vertex Shading" 和 "Projection" 功能环节.
geometry shader 是可选的, 完全可编程的环节, 操作图元上的顶点(点, 线, 三角形), 用于执行图元shading操作, 销毁图元, 创建图元
clipping, screen mapping, triangle setup, triangle traversal 环节都是固定功能环节.
pixel shader为可编程环节, 执行"Pixel shading".
merger 环节则为可编程和固定功能之间, 可进行很多配置来完成各种操作. color buffer, Z-buffer, blend, stencil和其他相关缓存.
3.2 The Programmable Shader Stage
现代shader环节(支持Shader Model 4.0)使用 common-shader core. 这表示 vertex, pixel, geometry shader 共享一个程序模型(programming model)
早期的 GPUs 在顶点和像素 shaders 有很少的共同点, 并且没有 geometry shader.
类C语法的着色语言: HLSL, Cg, GLSL, 这些语言编译至无关机器的汇编语言, 即 intermediate language(IL), 该汇编语言通常在驱动中转换至机器语言. 该汇编语言可看成虚拟机. 该虚拟机是一处理器, 可处理不同的register类型和数据类型, 通过一系列的指令编程. 有 4路 SIMD(single-instruction multiple-data)能力. 每个register也有四个独立的值. 基本数据类型为32位单精度浮点数和向量. 支持32位整数.
一个 draw call 请求图形API绘制一组图元. 引起图形管线的执行. 每个可编程shader环节有两个类型的输入: uniform input 和 varying input.
uniform inputs 在整个 draw call中保持不变. (但在 draw calls之间可以变化)
varying inputs 则不同
纹理可看成 uniform input, 但是其也可以作为其他纹理的索引数组数据.
可通过只读的constant register 或 constant buffers来访问 Uniform inputs.
虚拟机还有通用的 temporary registers, 用于 scratch space. 所有registers的类型都可以用temporary registers中的整数值来进行数组下标.
最快的操作时标量和向量乘法, 加法, 以及之间的组合, 如点乘. 其他的操作如求倒数(reciprocal), 平方根, sin, cos, 指数和对数都相对耗时.
shader支持两种类型的流控制: static流控制用于uniform输入. dynamic流控制用于 varying 输入
shader程序可以在程序加载之前或者运行期进行离线编译, 可通过设置选项来生成不同的输出文件, 以及使用不同的优化等级.
一个编译的shader存储为一文本字符串. 通过驱动传送给GPU
3.3 The Evolution of Programmable Shading
用于shader设计的 visual shader graph system: mental mill
2007年发展出Shader Model 4.0, 主要特性有 geometry shader 和 stream output.
新的程序模型如NVIDIA的CUDA和AMD的CTM用于non-graphics applications
3.3.1 Comparison of Shader Models
表3.1 Shader Model 2.0, 3.0, 4.0的区别
3.4 The Vertex Shader
在DX中, Vertex Shader环节之前的数据操作成为 input assembler. 将一些数据流组织成一系列顶点和图元发送给管线.
在 input assembler 中支持 使用instancing, 即一个对象使用不同的数据可以通过复制来绘制多次.
在DX10中, input assembler 会给每个instance(实例), 图元, 顶点一个唯一的数字作为标记, 以便后来的shader可以访问.
对于 triangle mesh而言, 在vertex shader中不关心哪些顶点形成哪些三角形, 只处理那些输入的顶点.
vertex shader, 每个传送进来的顶点, 输出所在三角形或线条的一系列插值, 不能创建和销毁顶点, 一个顶点的结果不能影响到另外一个顶点. 所以每个顶点都是独立处理的, 多个shader processors在GPU里可以平行处理输入的顶点数据流.
vertex shader 可以实现的效果: shadow volume, 活动关节的顶点混合(见超级宝典), silhouette rendering
Lens effect, 屏幕显示鱼眼效果, 水下, 以及其他的扭曲效果
Object definition, 创建mesh一次, 并通过 vertex shader变形
Object twist, bend, taper operation
Primitive creation, 通过发送退化(degenerate)mesh给后面的管线, 并在需要的时候给予这些mesh空间. 这个功能在更新的GPU中被geometry shader替代.
Page curls, heat haze, water ripples, 通过将整个帧缓存的内容作为纹理贴在屏幕对齐的mesh上, 而后进行程序变形操作.
Vertex texture fetch. 用于将纹理作用于顶点mesh, 这样可以让海洋表面, 地形高度图的渲染耗费更小.
Vertex shader的输出有几个用法, 常用的方法是生成和光栅化每个实例(instance)的三角形, 产生的各自像素片段发送给像素着色器程序. Shader Model 4.0则可将vertex shader的输出发送给geometry shader.
3.5 The Geometry Shader
geometry shader 位于 vertex shader之后, 可选的.
geometry shader 的输入是 单个对象和它的顶点. 对象通常为一个网格内的一个三角形, 一个线段或者一个点. 另外, 可以额外传送三个三角形外的三个顶点, 在一个多边形可用2个相邻的点.
geometry shader 的输出是另个