Basic Concepts in Graphics and Architecture
Posted italysue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,实现低能耗。
以上是关于Basic Concepts in Graphics and Architecture的主要内容,如果未能解决你的问题,请参考以下文章