Real-TimeRendering读书笔记-知识点概括——第三章(记忆用)
第三章,GPU
GPU由大量的(数以千计)处理器(着色单元)构成。
SIMD模式:single instruction,multiple data 单一指令,多数据
假如有一个模型需要两千个像素绘制,那么一个像素着色程序就需要被调用两千次,如果一个处理器来处理,那么如果像素需要访问纹理数值,这个访问指令的生成是非常迅速的,但是因为纹理数据并不存储在片元数据当中,它是在内存的其他位置,那么访问纹理数值是很耗时间的,所以该处理器不能在等待获得了纹理值再去绘制,而是要跳到下一个像素,生成调用纹理值指令,以此类推,直到获得了一个纹理值之后再返回去进行绘制。
每一个着色程序调用可以理解为一个线程(和CPU当中的线程意义不同),使用一个着色程序的线程可以被打包成一个组,在NVIDIA当中被称为warps,在AMD当中被称为wavefronts。
具体处理方式如下图:
Shader Language(HLSL、GLSL)被编译成虚拟机字节码也叫做中间语言,中间语言再被驱动程序转换为指令集(ISA)在GPU上运行。基本数据类型是32位单精度浮点标量和向量,现代GPU也支持32位整型和64位浮点型数据。还支持一些聚合类型如结构体、矩阵和数组。
着色编程:
DrawCall:调用图形API去绘制片元,每个可编程的图形着色程序(shader)有两种不同的输入:Uniform(一次DrawCall中不会改变的值)和Varying(一次DrawCall中不断改变的值)一般用来存储Uniform值的寄存器要比用来存储Varying值的寄存器多得多。
Flow control流程控制:分为静态流程控制和动态流程控制。
静态流程控制主要是为了针对不同的情况可以应用同一个shader(意义相当于ShaderLab中的Pass)
动态流程控制主要是应对不同的varying输入进行不同的操作(相当于if语句)
图形编程API演变史:
ShaderModel DirectX提出来区分不同硬件的着色能力。
DirectX9 ShaderModel2.0 可编程的顶点和像素着色器
ShaderModel3.0 流式控制
DirectX10 ShaderModel4.0 几何着色器和流式输出
DirectX11 ShaderModel5.0 tessellation stage shaders and the compute shader
VertexShader
顶点着色器的用途:动画、程序性变形、粒子系统等等。
The Tessellation Stage (曲面细分)
相关内容参考:曲面细分着色器相关
在DirectX11中开始被支持,在OpenGL4.0中被支持
主要包含三个部分:hull shader、tessellator、domain shader
输入是控制点和一些细分曲面。
Hull shader负责告诉tessellator生成多少三角形,以及怎样生成,生成什么样子。同时hull shader也可以更改、操作控制点。
tessellator在管线当中是一个固定的函数,hull shader告诉它需要生成什么样子的曲面。另外hull
Shader也传递两个重要的参数:inner 和 outer edge。
细分曲面的数量通过指定两组值:内部和外部细分曲面程度来控制的。外部细分曲面的值控制域的周边是如何划分的,然后存放在一个隐式声明的名为 gl_TessLevelOuter 的含有四个元素的数组中。而内部细分曲面程度指定了域的内部如何进行划分,然后存放在一个名为 gl_TessLevelInner 的含有两个元素的数组中。