real time rendering 4th-Chapter03-GPU

Data Parallel Architectures

在这里插入图片描述

if 问题

  1. 如果在一个warp中所有的线程都按照同样的路径运行,那么效率不会有问题
  2. 如果在一个warp中有的线程执行路径A,有的执行路径B那么,就会出现问题。有的线程就需要等待别的线程。比如:有的线程在执行loop

GPU Pipeline Overview

在这里插入图片描述

  1. 绿色的为fully programmable管线
  2. 黄色的为可配置的管线
  3. 蓝色的为固定功能管线
  4. 虚线表示,GPU的可选实现

The Programmable Shader Stage

common-shader core

  1. 每个core都可以用于运行(顶点,pixel(fragment),细分)。
  2. 可以动态负载。

着色器语言

  1. DX(HLSL)可编译为中间语言,预先存储起来
  2. OpenGL(GLSL)

draw call

在这里插入图片描述

输入类型

uniform(寄存器更多)

在整个draw call过程中不变,不同的draw call是可以变化的。比如:光源颜色,材质

varying(寄存器更少)

可以变化.比如:顶点位置

内部操作函数

  1. 矩阵操作
  2. 三角函数
  3. 基本运算

control

  1. static flow control 编译器就能决定的控制流程
  2. dynamic flow control 运行时决定的控制流程(会影响性能)

The Evolution of Programmable Shading and APIs

WebGL(three.js)

The Vertex Shader

  1. 顶点着色器的功能,主要是处理和顶点相关的属性。它可以做变换处理。
  2. 顶点着色器不可以删除顶点。只能处理和它相关的属性。
  3. 顶点着色器的输出至少有一个clip space中的location
  4. 顶点着色器不能把处理的信息指定给其他的顶点。
  5. 顶点着色器下一个管线为光栅化,但是有的GPU实现了细分和几何着色器。

顶点着色可以实现哪些效果?

  1. Object generation, by creating a mesh only once and having it be deformed by the vertex shader.
  2. Animating character’s bodies and faces using skinning and morphing techniques.
  3. Procedural deformations, such as the movement of flags, cloth, or water
  4. Particle creation, by sending degenerate (no area) meshes down the pipeline and having these be given an area as needed.
  5. 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.
  6. 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

两项目功能

  1. 告诉 tessellator 需要产生多少个三角形
  2. 处理生成控制点。(比如,增加或者删除控制点),输出控制点直接输出到第三步,以及控制下一个固定管线的参数。

primitive generator

产生一个正三角形或者是四边形的细分结果

  1. 内部参数,图形内部产生多少个三角形。
  2. 外部参数,边如果裂解,裂解出多少条边。怎么裂解。

tessllation evaluation shader

求解器,根据前两个阶段的数据进行求值拟合。

The Geometry Shader

几何着色器,主要是变换对象。

  1. 比如把点变成正方形。
  2. 把正方形编程点。
  3. 增加三角面片的数量。
  4. 减少三角面片的数量。
  5. 加边框等。
  6. 几何着色器是根据输入按顺序输出的,所以可能会影响性能。
  7. 可以支持instance,复用。

不常用,因为和现代GPU的分层理念不是很切合。有的mobile device甚至用软件来实现着一层。

Stream Output

经过顶点着色器(可选的细分和几何)之后,可以将顶点信息输出到一个buffer中。这个buffer中的数据,可以返回给管线进行迭代等。

  • 有一个缺点。共享顶点的三角面片信息会丢失。

The Pixel Shader

  1. 轴线光栅化器会把三角面片分成fragments,这些fragments对应各自的像素点。所以在OpenGL中pixel shader被叫做fragment shader。

  2. 像素着色器还可以丢弃像素。

  3. 像素着色器可以输出到多个目标buffer中。

  4. 可以实现deferrel shading(PS:后面会讲到)

  5. 像素着色器不可以阅读邻接像素的数据。

  6. 但是不同pass的像素着色器可以阅读其他pass产生的image。其实可以使用图像处理技术来处理邻接像素的东西

  7. 像素着色器,可以获得邻接像素的信息的列外是梯度和导数信息。

  8. 所有现代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
  9. 可以随意写到任何位置的buffer

    • DirectX 叫做unordered access view (UAV)
    • OpenGL 叫做 shader storage buffer object (SSBO)
  10. Rasterizer order views (ROVs) in DirectX 11.3
    和UAV很像,但是不同之处是,数据访问是按照顺序执行的。

The Merging Stage

从pixel shader中会产生一个fragment的信息。这些信息会和framebuffer中的内容进行比较和混合处理

  1. 深度测试
  2. stencil buffer测试
  3. 透明
  4. 混合

early-z

  1. pixel shader提前进行merge中的z-buufer测试。如果测试不通过。那么根本就没有必要处理当前fragment。则直接丢弃。
  2. 如果pixel shader中有变动z-buffer值的操作,则会打乱early-z。这个时候,early-z会关闭。
  3. early-z的有效利用可以大幅提高运行效率。

merge stage不是可编程的

但是,它是高度可配置的。

The Compute Shader

把计算机当做大量的并行处理器使用。使用CUDA或者OpenCL来控制。注意看第一节中的GPU架构图,warps和threads,是并行计算的重要概念。

  1. 比如机器学习中训练神经网络,就大量使用到了GPU的并行计算。

  2. 还有很多图形学中的应用也可以使用并行计算,比如

    • 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

学习并行计算

  1. CUDA
  2. OpenCL

三本学习着色器的书籍

  1. 《OpenGL Superbible》
  2. 《OpenGL Programming Guide》
  3. 《OpenGL Shading Language》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值