Basic Concepts in Graphics and Architecture

1.  Graphics pipline和DirectX各版本的重大变化

1.1 Graphics pipline概述

       Graphics pipline是描述图形系统将3D场景渲染到2D屏幕需要执行的步骤的概念模型。包括以下步骤:

    (1)3D model input:

              三角形,三个顶点各自携带几何坐标、光照颜色、纹理坐标信息。

    (2)Transform&lighting:

           (a)空间变化流程:

                    Object space(Modeling Transformations)->World space(计算光照,然后进行透视变化)->Eye space(除法,回到三维)->NDC(视穿变换)->Screen space

           (b)计算光照

                    对每个顶点计算光照和颜色

TIPS1:为什么要采用齐次坐标?

           a.合并操作矩阵,将缩放、旋转、平移矩阵操作合成一个单一的矩阵;b.可以表示无穷远的点。

难点1:clipping剪裁在什么时机进行?

     (3)Rasterization:

              计算机三角形覆盖屏幕上的哪些像素

     (4)Texture Mapping:

               纹理是用来包裹物体,使其更加真实的位图。关键是纹理采样。纹理和光照进行叠加,生成图像。

难点2:所有坐标需要进行透视校正

      (5)Depth Test

               每个三角形离屏幕都有一个深度,记录在Depth-buffer中,离屏幕近的显示在上面,离屏幕远的可能就被遮挡了,不用画了。

1.2 DirectX各版本的重大变化

    (1)DirectX9

               Transform&Lighting->Vertex shader

               Texture&coloring->Pixel shader

     (2)DirectX10

               Geometry shader:输入一个三角形,输出k个三角形。可以放大输入顶点的数量,消除从CPU到GPU的瓶颈。导致了硬件设计的重大困难

               Stream out:算出来的内部数据可以循环使用,GPU计算下一个时刻的颜色和位置等,不需要CPU参与。不仅是性能福利,也使粒子系统完全独立于CPU

               提出Unified shader的理念:Vertex shader和Pixel shader负载不均衡,所以统一着色器架构,共用硬件,用公平的调度算法分配资源

     (3)DirectX11

               输入不再是三角形而是曲面(Patch Prim),曲面上有16个控制点。     

               Hull shader:对曲面的16个控制点进行变换,并生成细分因子

               Tessellator:生成36个三角形网格的其次坐标

               Domain shader:网格坐标结合原始的patch带入曲面方程,进行36次插值

2. Graphics Architecture设计的基本理念

2.1 EU模块设计

         Vertex shader & Pixel shader并行处理,互不相关。执行shader的硬件由三部分组成:Fetch/Decode,ALU,Execution context。传统的CPU中的方法在GPU中并不适用,GPU中的核心设计思想是:

        KeyConcept1:slimmed down cores to make it light and can fly in parallel

              减小每个单元的成本,增加并行单元数量

        KeyConcept2:SIMD,单指令多数据流

             分享指令流,运算单元是各自的,但是取址和解码是共享的。一个指令流运算8个像素,硬件中16个core,128个像素并行处理能力。

        KeyConcept3:并发交错以隐藏停顿

              解决纹理采样中速度的不匹配问题,纹理访问到Memory中取需要100-1000个cycles。交错执行,core一直处理忙碌状态,先前等待的资源到了,继续执行。

        EU执行单元设计总结:

              16core同时输入16串指令流,每个core中8个ALU单元,每个core可以4个流同时并发交错执行,所以总计可以同时计算512个片段。

2.2 core调度

        设计要点:预分配资源;动态派发;保证顺序。

        KeyConcept1:保持硬件忙碌

              静态预分配所有必要的资源,在任务开始前避免死锁这种情况同时保证进行向前。Geometry shader很慢,因为其允许动态膨胀,消耗硬件资源。

        KeyConcept2:动态派发实现负载均衡

             通过动态生成、聚合和重新分配任务来管理不规则性。VS生成的三角形的像素不一定要自己的core执行,通过Fixed Function进行动态派发,将任务发配给闲置的单元。

        KeyConcept3:preallocate outputs in FIFO order

              动态派发可能导致乱序问题,进来的时候,预先分配好出去的顺序,先进先出。乱序执行但是按顺序输出,然后进行blending。

(1)为什么Rasterization不用EU来执行?

        a)    它会导致不规则的数据膨胀

        b)    它需要进行动态派发,为后续的PS中所有的core都能忙碌起来。

        c)     必须在保证顺序的情况下重新分发。

(2)为什么ZU不用EU来执行?

        ZU会导致early reject,会减少任务的数目,需要重新派发的过程,所以ZU不能成为shader。此外,ZU必须保持先后顺序一定相关,所以必须进行重新排序。

3. Fiexd-Function模块

        逻辑和实际硬件设计模块的映射关系

      (1)IA->BCI 输入指令,考虑了硬件特性重新取名,和逻辑上功能一致

      (2)Tess 和逻辑上功能一致

      (3)PA->TAS 三角形属性设置模块,包含两部分功能:算出三角形三条边的方程,算出三角形内部的每一个像素用来插值的属性。

      (4)Rast->SG(重新派发),TG,IU

                  SG:一条条扫描线覆盖屏幕上的每一像素点,判断点在三角形内部还是外部

                  TG:拼贴成8乘8的块,以便后面计算方便

                  IU:对每个顶点用算出来的属性值进行插值

      (5)OM->Z(ZL1,ZL2,ZL3),WBU

                ZL1(实际已经去除):在TG8乘8的块基础上,做计算

                ZL2:去除被遮挡的像素,节省资源

                ZL3:重新进行深度检查

TAS算过属性值,存在buffer中,需要插值pixel属性值时的时候直接从buffer中取就行了,实现复用。

WBU对顺序有要求,所以也不能在shader中执行。3.0提出blending可以在shader中执行,这对硬件提出了很大的挑战。

FLU:fixed-function中各个模块都需要进行基本运算,共用FLU单元,有需求时就利用FLU单元进行计算。

动态共享cache,那个模块需要就利用共享的cache。

从memory中预取数据放到cache中,减少读取数据的等待时间。

EU有并行高速的处理能力,FF处理能力能否匹配?设置多个Slice,每个slice对应一个FF。

对于对性能要求不高的任务,可以将EU模块全部停电,甚至取一个slice,实现低能耗。

猜你喜欢

转载自www.cnblogs.com/italysue/p/9383124.html
今日推荐