1. vertex,pixel以及geometry shaders共享一个programming model,即common-shader core,在GPU架构中的unified shader可以和这个core很好的契合。
common-shader core是API,支持unified shader是GPU的特性。
2. shaders是用类C的语言如HLSL,Cg,GLSL等编写的,程序被编译为不依赖于机器的assembly language,即intermediate language(IL)中间语言。编译完的shader存储成文本字符串通过driver传给GPU
assembly language(汇编语言)在另外的步骤中(通常在driver中)被转换为真正的机器语言,这就允许不同的硬件的兼容性。这个assembly language可以看作是定义了一个虚拟机,这个虚拟机是一个有着各种寄存器类型和数据源,用一系列指令变成的处理器。
2.1 大部分graphics操作都是在短矢量上完成的,所以处理器有4-way SIMD(single-instruction multiple-data)能力 每个寄存器包含了四个独立值。
32-bit单精度浮点标量和矢量以及32-bit整型数是基本数据类型,其中浮点矢量可以包含像位置(xyzw)、法线、矩阵行、颜色(rgba)或者纹理坐标(uvwq). 聚合数据类型也支持,如结构体、数组和矩阵。还支持swizzling,即任何矢量部分的复制,也就是说,矢量的任何部分都可以被任意重新排序或者复制。同样,masking(仅适用部分矢量元素)也支持
2.2 一个drall call会激活graphics API去画一组primitives,graphics pipeline由此开始执行。
2.3 每个可编程shader stage都有两个输入,uniform input和varying input。
uniform input在一个draw call中一直保持值不变,但是可能会在不同的draw call之间改变值。 texture是一种特殊的uniform input,以前可以看作是用到一个surface的颜色图片,现在可以看作是一个大的数据矩阵
varying input在shader处理的每个vertex或者pixel中都不同。
2.4 虽然shader的输入有很多种,但是shader的输出被严格限制了,这是shader和其他在通用处理器上执行的程序不同的地方。
2.5 底层的虚拟机给不同种类的输入和输出提供了特殊寄存器。
uniform input是存储在constant registers/buffers,因为他们的内容是不变的
可用的常量寄存器数量比varying input寄存器数量大得多,因为varying inputs和outputs都需要分别存放在每个vertex/pixel,而uniform inputs只需要保持一次并重用在所有的vertices/pixels。
2.6 虚拟机也有通用temporary registers,用于scratch space(暂存空间)。 all types of registers can be array-indexed using integer values in temporary registers.
2.7 GPU上执行最快的操作是标量和向量乘加以及它们的混合操作,如乘加、内积,其他的操作,如倒数,平方根,sine,cosine,幂运算以及对数运算,一般更耗时间,但是还算快的。
纹理操作也是有效率的,但是它的performance可能会被一些因素限制,如耗费在等待某个结果的时间 shading language开放了大部分的普通运算,如加法和乘法,剩下的运算是用intrinsic函数,如atan(),dot(),log()等,还有负责运算如矢量归一化,矩阵转置等。
2.8 flow control
flow control(流程控制)是指用分支指令来改变代码执行流程,如if case等。 shader支持两种类型的flow control: static flow control, dynamic flow control
static flow control是基于uniform input的值,而dynamic flow control是基于varying input的值