Draw Call:理解为一个命令,由CPU发起,GPU接收,命令指向一个需要被渲染的图元列表,计算数据后输出为像素
顶点着色器:每个定点都会调用一次,完成坐标的变换(将定点坐标从模型空间转换到其次裁剪空间)和逐定点的光照。
三角形设置:由得到的信息计算每个图元覆盖的像素,计算像素的颜色
三角形遍历:检查每个像素是否被一个三角网格覆盖。被覆盖则生成一个片元(片元并不是真正意义上的像素)
片元着色器(像素着色器):进行逐片元的操作,输入的是对顶点着色器输出的信息插值得到的结果(为了在片元着色器中进行纹理采样,通常在定点着色器阶段输出每个顶点对应的纹理坐标)
逐片元操作:决定片元的可见性,混合颜色信息
HLSL(DirectX):High Level Shading Language
Cg(Nvidia):C for Graphic
GLSL(OpenGL):OpenGL Shading Language
DrawCall数量影响:DrawCall之前CPU向GPU提交数据,DrawCall多时,过多的CPU提交数据造成CPU过载
Unity Shader:用ShaderLab编写,ShaderLab是Unity提供的编写UnityShader的一种说明性语言
通过Shader名称的字符串中添加'/'修改对应Shader出现在菜单中的位置
Properties:用于包含需要显示在Inspector面板中的属性的语义块
\\ Example
Properties{
Name("display name", PropertyType) = DefaultValue
}
SubShader:
- 一个Shader中至少包含一个SubShader
- Unity会选择第一个可以在当前平台使用的SubShader,都不行的话使用Fallback指定的UnityShader
- SubShader中会定义一系列的Pass,RenderSetup,Tags
常见渲染状态:
- Cull:设置剔除模式,背面(Back),证明(Front),关闭(Off)
- ZTest:设置深度测试使用函数
- ZWrite:开启和关闭深度写入
- Blend:开启并设置混合模式
Pass语义块:
- 通过Name "MyPassName"命名,从而实现复用
- 复用使用UsePass "MyShader/MYPASSNAME",PassName部分要使用全大写
Fallback:如果所有的SubShader都用不了的话就使用Fallback提供备选的Shader
表面着色器(Surface Shader):
- 需要代码量少,但是渲染代价比较大
- 处理很多光照细节
顶点/片元着色器(Vertex/Fragment Shader):
- 代码复杂但是灵活度高
- 代码写在Pass语义块内,自己定义每个Pass的Shader代码
Unity Shader并非是真正的Shader
- Unity里,Unity Shader指的只是一个ShaderLab文件
- Unity Shader可以同时编写顶点着色器和片元着色器
- 本质上说Unity中只存在定点/片元着色器
Unity中的笛卡尔坐标系
- 对于模型空间和世界空间,使用的是左手系
- 观察空间使用的是右手系
点(Point):维度空间里面的一个位置,主要为二维空间或者三维空间
矢量(vector):包含了模和方向的有向线段,小写粗体表示,通常用于相对于某个点的偏移
单位矢量:模为1的矢量,也称为归一化的矢量,将矢量转化成单位矢量的过程叫做归一化,单位矢量使用小写粗体字符上添加'^'表示
矢量的点积:
- 也称为内积
- dot(a,b)表示两个矢量的点积,计算为矢量对应的分量分别相乘。
- 点积的其中一个几何意义就是投影,一个矢量a点积一个矢量b,除以a模则是b在a上的投影,除以b的模则是a在b方向上的投影
- 正负表示与单位矢量a方向相同或者相反
- 一个矢量与自身进行点积,结果是矢量模的平方
- 两个单位矢量的点积是对应的余弦值
矢量的叉积:
- 也成为矢量的外积
- 计算的结果仍然是一个矢量
- axb = (aybz - azby, azbx - axbz, axby - aybx),计算的角标是按照xyz连续相邻
- 不满足交换率
- 点积的向量的长度为a的模和b的模乘以sin夹夹角值
- 左手系和右手系不会对计算结果产生影响,影响的知识三维空间中视觉表现
矩阵(Matrix):
- 由mxn个标量组成的长方形数组
- 矩阵乘法满足结合率不满足交换率
方块矩阵:
- 简称方阵,行数和列数相等的矩阵
- 有对角元素,对角元素为行数和列数相等的元素
对角矩阵:
- 对角矩阵是除了对角元素外都为0的对角矩阵
单位矩阵:
- 将原矩阵的第i行变成了第i列,即为转置矩阵
逆矩阵:
- 矩阵可逆的前提是方块矩阵
- 如果矩阵有逆矩阵则说矩阵可逆
- 矩阵的行列式不为0,则矩阵可逆
- 转置矩阵的逆矩阵是逆矩阵的转置
正交矩阵:
如果一个方阵和其转置矩阵的相乘为单位矩阵则为正交矩阵