real time rendering 4th-Chapter03-GPU
Data Parallel Architectures
if 问题
- 如果在一个warp中所有的线程都按照同样的路径运行,那么效率不会有问题
- 如果在一个warp中有的线程执行路径A,有的执行路径B那么,就会出现问题。有的线程就需要等待别的线程。比如:有的线程在执行loop
GPU Pipeline Overview
- 绿色的为fully programmable管线
- 黄色的为可配置的管线
- 蓝色的为固定功能管线
- 虚线表示,GPU的可选实现
The Programmable Shader Stage
common-shader core
- 每个core都可以用于运行(顶点,pixel(fragment),细分)。
- 可以动态负载。
着色器语言
- DX(HLSL)可编译为中间语言,预先存储起来
- OpenGL(GLSL)
draw call
输入类型
uniform(寄存器更多)
在整个draw call过程中不变,不同的draw call是可以变化的。比如:光源颜色,材质
varying(寄存器更少)
可以变化.比如:顶点位置
内部操作函数
- 矩阵操作
- 三角函数
- 基本运算
control
- static flow control 编译器就能决定的控制流程
- dynamic flow control 运行时决定的控制流程(会影响性能)
The Evolution of Programmable Shading and APIs
WebGL(three.js)
The Vertex Shader
- 顶点着色器的功能,主要是处理和顶点相关的属性。它可以做变换处理。
- 顶点着色器不可以删除顶点。只能处理和它相关的属性。
- 顶点着色器的输出至少有一个clip space中的location
- 顶点着色器不能把处理的信息指定给其他的顶点。
- 顶点着色器下一个管线为光栅化,但是有的GPU实现了细分和几何着色器。
顶点着色可以实现哪些效果?
- Object generation, by creating a mesh only once and having it be deformed by the vertex shader.
- Animating character’s bodies and faces using skinning and morphing techniques.
- Procedural deformations, such as the movement of flags, cloth, or water
- Particle creation, by sending degenerate (no area) meshes down the pipeline and having these be given an area as needed.
- Lens distortion, heat haze, water ripples, page curls, and other effects, by using the entire framebuffer’s contents as a texture on a screen-aligned mesh undergo- ing procedural deformation.
- Applying terrain height fields by using vertex texture fetch
The Tessellation Stage
细分着色器分为三个阶段
-
DirectX
- hull shader
- tessellator(固定的管线)
- domain shader
-
OpenGL
- tessllation control shader
- primitive generator(固定的管线)
- tessllation evaluation shader
tessllation control shader
两项目功能
- 告诉 tessellator 需要产生多少个三角形
- 处理生成控制点。(比如,增加或者删除控制点),输出控制点直接输出到第三步,以及控制下一个固定管线的参数。
primitive generator
产生一个正三角形或者是四边形的细分结果
- 内部参数,图形内部产生多少个三角形。
- 外部参数,边如果裂解,裂解出多少条边。怎么裂解。
tessllation evaluation shader
求解器,根据前两个阶段的数据进行求值拟合。
The Geometry Shader
几何着色器,主要是变换对象。
- 比如把点变成正方形。
- 把正方形编程点。
- 增加三角面片的数量。
- 减少三角面片的数量。
- 加边框等。
- 几何着色器是根据输入按顺序输出的,所以可能会影响性能。
- 可以支持instance,复用。
不常用,因为和现代GPU的分层理念不是很切合。有的mobile device甚至用软件来实现着一层。
Stream Output
经过顶点着色器(可选的细分和几何)之后,可以将顶点信息输出到一个buffer中。这个buffer中的数据,可以返回给管线进行迭代等。
- 有一个缺点。共享顶点的三角面片信息会丢失。
The Pixel Shader
-
轴线光栅化器会把三角面片分成fragments,这些fragments对应各自的像素点。所以在OpenGL中pixel shader被叫做fragment shader。
-
像素着色器还可以丢弃像素。
-
像素着色器可以输出到多个目标buffer中。
-
可以实现deferrel shading(PS:后面会讲到)
-
像素着色器不可以阅读邻接像素的数据。
-
但是不同pass的像素着色器可以阅读其他pass产生的image。其实可以使用图像处理技术来处理邻接像素的东西
-
像素着色器,可以获得邻接像素的信息的列外是梯度和导数信息。
-
所有现代GPU把2x2区域的fragments当做一个quad。
- When the pixel shader requests a gradient value, the difference between adjacent fragments is returned.
- gradient information can- not be accessed in parts of the shader affected by dynamic flow control
-
可以随意写到任何位置的buffer
- DirectX 叫做unordered access view (UAV)
- OpenGL 叫做 shader storage buffer object (SSBO)
-
Rasterizer order views (ROVs) in DirectX 11.3
和UAV很像,但是不同之处是,数据访问是按照顺序执行的。
The Merging Stage
从pixel shader中会产生一个fragment的信息。这些信息会和framebuffer中的内容进行比较和混合处理
- 深度测试
- stencil buffer测试
- 透明
- 混合
early-z
- pixel shader提前进行merge中的z-buufer测试。如果测试不通过。那么根本就没有必要处理当前fragment。则直接丢弃。
- 如果pixel shader中有变动z-buffer值的操作,则会打乱early-z。这个时候,early-z会关闭。
- early-z的有效利用可以大幅提高运行效率。
merge stage不是可编程的
但是,它是高度可配置的。
The Compute Shader
把计算机当做大量的并行处理器使用。使用CUDA或者OpenCL来控制。注意看第一节中的GPU架构图,warps和threads,是并行计算的重要概念。
-
比如机器学习中训练神经网络,就大量使用到了GPU的并行计算。
-
还有很多图形学中的应用也可以使用并行计算,比如
-
particle systems
-
mesh processing such as facial animation
-
culling
-
image filtering
-
improving depth precision
-
shadows
-
depth of field
-
compute shaders can be more efficient than tessellation hull shaders.
-
总之,也就是说,可以把以前在CPU上运行的可以并行化的部分,搬到GPU来做。充分利用GPU的并行特性,最终达到加速的目的。
Furthur Reading and Resources
学习并行计算
- CUDA
- OpenCL
三本学习着色器的书籍
- 《OpenGL Superbible》
- 《OpenGL Programming Guide》
- 《OpenGL Shading Language》