[实时渲染] 3.2 可编程着色阶段

     现代着色阶段(着色模型4.0,Vista上Directx 10以及更新版)使用通用着色器核心(common-shader core),这是说顶点,像素和几何着色器共享一个编程模型。本书中我们将来区分应用程序开发者可见的通用着色器核心和统一着色器,一种将所有都映射到相同该核心的GPU架构,见18.4节。通用着色器核心是一种API,统一着色器是一种GPU特性,早期的GPU的顶点和像素着色器含有极少的共性,并且没有几何着色器,尽管如此,统一着色器模型的大部分设计元素都可以被老的硬件使用;大部分情况下,老版的设计元素要么被简化了,要么取消了,并非是完全不同。所以目前我们注重关注于着色器模型4.0,后面的章节再讨论老版的着色器模型。

     介绍整个整个编程模型超出了本书的范围,并且有很多的文档,书籍以及网站来介绍相关内容[261,338,647,1084]。[a few comments in order]。Shader使用类C语言的着色器语言进行编程,如HLSL,Cg和GLSL,这些程序被编译成机器无关的汇编语言,也称为中间语言(IL, intermediate language)。之前的着色器模型允许直接使用汇编语言编程,但是在DirectX10上汇编语言仅可做为调试输出使用。汇编语言在通常在驱动在被转换成真实的机器语言,汇编语言可以被看成是一个虚拟机,是着色器语言的编译目标。

     该虚拟机是一个包含了一个指令集的处理器包含了各种类型的寄存器,数据资源,因为很多的图形操作使用短向量(最长4个分量),所以该处理器包含了4路SIMD(单指令多数据流)能力,每个寄存器包含了4个独立的值。32位的单精度浮点数的标量和向量是基本的数据类型,32位整型的支持是最近才被加上的。浮点向量通常包含的数据有位置(xyzw),法线,矩阵行,颜色(rgba)和纹理坐标(uvwq)。整数通常被用于计数器,索引以及位掩码(bit mask),也支持聚合的数据类型如结构体,数组以及矩阵,为了促进向量的工作,也支持任意向量元素的复制与调配,这也是说风和向量元素可以按想要的方式进行调整顺序以及复制,类似上,向量中指定元素可被使用的掩码操作也是支持的。

    一个绘制调用是调用图形API来绘制一组图元,会导致图形管线工作,每个可编程着色器阶段包含两种类型的输入:uniform输入,在整个绘制调用期间保持不变(多个绘制调用之间可被改变);varying输入,每个顶点和像素的值是不同的。纹理是一类特殊的uniform输入,曾经只是作为颜色图像被作用表面,但现在可以作为任意的数据数组。需要强调的是,尽管着色器含有大量的输入,可以使用不同的方式进行定位,但输出却被严格限制,这也是着色器与通用处理器执行程序的最大不同。底层虚拟机给不同类型的输入输出提供了特殊的寄存器,uniform输入使用仅可读的常量寄存器(常量缓冲区),只所以如此称之是因为在整个绘制调用期间他们值是不变的。可用的常量寄存器的数量远大于用于varying输入输出的寄存器数量。这是因为varying的输入输出需要每个顶点和像素进行单独存储,而uniform类型的输入只被存储一次且在整个绘制调用期间被所有的顶点和像素复用。该虚拟机也包含了通用功能的临时寄存器,被用作暂存空间(scratch space),所有类型的寄存器都可以在临时寄存器中使用整数进行数组索引。着色器虚拟机制输入输出参见图3.2。
[实时渲染] 3.2 可编程着色阶段_第1张图片
     图形计算中的常见操作在现代GPU上执行非常高效,典型地,最快的操作是标量和向量的乘法,加法以及他们的组合,如乘加(multiply-add)和点积(dot-product)。其它操作如倒数,平方根,sin,cos,指数以及对数的消耗会有点大,但是依然很快速。纹理操作(见第6章)是高效的,但是他们的性能受限其它因素,如遍历可用结果的等待时间。着色语言使用操作符(如*和+)暴露了常用操作(如加法和乘法),其它操作使用内部函数(intrinsic function)的方式进行呈现,如atan(), dot(),log()等等,内部函数也包含更复杂的操作,例如向量的规一化和反射,叉积,矩阵变换,以及求行列式的值等。

你可能感兴趣的:(游戏开发,实时渲染)