zoukankan      html  css  js  c++  java
  • 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,实现低能耗。

  • 相关阅读:
    vue使用bus总线,实现非父子组件间的通信
    vue的$on,$emit的使用
    vue中使用v-bind="$attrs"和v-on="$listeners"进行多层组件监听
    手机端页面,点击手机号拨打电话
    Google Chrome 错误代码“STATUS_INVALID_IMAGE_HASH”
    Nuxt项目启动或打包时,显示内存不足溢出问题解决方案
    使用van-tabbar底部导航栏,会覆盖页面内容解决方法
    微信公众号配置
    文件在线预览kkFileView的使用
    akka-typed(7)
  • 原文地址:https://www.cnblogs.com/italysue/p/9383124.html
Copyright © 2011-2022 走看看