渲染流水线总览
作者:互联网
1.Color Basics
-
计算机以红绿蓝三色光的强度表示颜色,alpha分量则是表示颜色的不透明度,如此以4D分量(r,g,b,a)表示颜色,每个分量的范围都在0~1,0表示没有强度,1表示最高强度
-
颜色通常可以表示成32位整数和128位实数,32位颜色常用于存储,128位则用于计算。把32位颜色的各个分量分别除以255即可转为范围为[0,1]的128位颜色,即为归一化。因为在计算机领域,由于计算机只能存储有限的小数位数,实数经常用浮点数来表示
typedef __m128 XMVECTOR; //__m128为128位.union特点:共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度的整数倍。 //__declspec(align(16))是设定内存对齐方式 typedef union __declspec(intrin_type) __declspec(align(16)) __m128 { float m128_f32[4]; unsigned __int64 m128_u64[2]; __int8 m128_i8[16]; __int16 m128_i16[8]; __int32 m128_i32[4]; __int64 m128_i64[2]; unsigned __int8 m128_u8[16]; unsigned __int16 m128_u16[8]; unsigned __int32 m128_u32[4]; } __m128;
-
我们常常用XMVECTOR借助SIMD技术进行高精度的颜色值计算,而颜色的存储则以XMCOLOR存储
-
获取 XMCOLOR类型实例并返回其对应XMVECTOR类型值:
XMVECTOR XM_CALLCONV PackedVector::XMLoadColor( const XMCOLOR* pSource); //XMVECTOR转换为XMCOLOR void XM_CALLCONV PackedVector::XMStorColor( XMCOLOR* pDestination, FXMVECTOR V);
-
点积叉积的运算法则并不适用于颜色向量,而其拥有自己的分量式乘法:
$$
(c_r,c_g,c_b) \bigotimes (k_r,k_g,k_b) = (c_rk_r,c_gk_g,c_bk_b)
$$
2.Graphics Pipeline
-
渲染管线主要是决定在给定虚拟相机、三维物体、光源、照明模式,以及纹理等诸多条件的情况下,生成或绘制一幅二维图像的过程
-
而渲染管线主要可分为三个阶段:
- 应用程序阶段
- 几何阶段
- 光栅化阶段
-
每个阶段本身也可能是一条管线。还可以对有的阶段进行全部或者部分的并行化处理
-
最慢的管线阶段决定绘制速度,即图像的更新速度,用FPS来表示
-
- 输入装配器阶段:从显存读取几何数据,再将此装配为几何图元
- 顶点着色器阶段:顶点需要执行的变换、位移贴图、光照处理
- 外壳着色器阶段:将模型的单个表面分解为许多三角形
- 曲面细分阶段:增加和移动物体表面的三角形
- 域着色器阶段:基于外壳着色器 (HS) 阶段和细化器 (TS) 阶段中的输入,输出修补程序中细分点的顶点位置
- 几何着色器阶段:处理整个基元
- 流输出阶段:将管道中的基元数据沿着到光栅器的路线流到内存中
- 光栅化阶段:为投影至屏幕上的3D三角形计算出对应的像素颜色
- 像素着色器阶段:将常变量、纹理数据、内插的每顶点值和其他数据组合起来以生成每像素输出
- 输出合并阶段:使用管道状态的组合、像素着色器生成的像素数据、呈现目标的内容以及深度/模具缓冲区的内容的组合生成最终呈现的像素颜色
3.Transformation
-
三角形是最基础的多边形,任何物体都可以用三角形网格表示。三个顶点确定一个三角形,而顶点除了定义每个顶点的坐标位置以外,还含有颜色等其他信息
-
通过顶点缓冲区将顶点与渲染管线相绑定
-
图元(geometric primitive):如线条和三角形这种构成多边形的基本元素
-
图元拓扑:告知Direct3D如何用顶点数据表示几何图元.。用enum D3D_PRIMITIVE_TOPOLOGY表示
-
具有邻接数据的图元拓扑:每个n边形都有n个与之相邻的邻接n边形
-
MVP矩阵:
-
Model transformation (placing objects)
世界坐标系下有很多Object,用一个变化矩阵把它们的顶点坐标从Local坐标系(相对)转换到世界Global坐标系(绝对)
-
View transformation (placing camera)
我们看到的画面由摄像机捕捉,摄像机参数决定了我们在屏幕上看到的东西,这一步可以将世界坐标系转换到摄像机坐标系
-
Projection transformation
摄像机坐标系,视锥体,再规整一下
-
-
世界空间的y轴方向与虚拟摄像机“向上”向量的方向相同
-
只要给定摄像机的位置、观察目标点和世界空间中“向上”方向的向量,就能构建对应的局部坐标系并推导出观察矩阵
-
Viewing (观测) transformation
- View (视图) / Camera transformation
- Projection (投影) transformation
- Orthographic projection (cuboid to “canonical” cube [-1, 1]^3)
- Perspective projection (frustum to “canonical” cube)
- First “squish” the frustum into a cuboid
- Then Do orthographic projection
-
正射投影矩阵定义了一个类似立方体的平截头箱,它定义了一个裁剪空间,在这空间之外的顶点都会被裁剪掉,投影完没有透视效果。创建一个正射投影矩阵需要指定可见平截头体的宽、高和长度
-
透视投影:把透视投影变成正射投影,再用之前正射投影的办法得到标准化设备坐标
-
裁剪:丢弃完全位于视锥体之外的集合体。方法:找到平面与多边形的所有交点,并将这些顶点按顺序组织成新的裁剪多边形
标签:__,颜色,渲染,m128,阶段,顶点,流水线,总览,着色器 来源: https://www.cnblogs.com/chenglixue/p/16695078.html