Shader基础概念
1、渲染流水线简述
? ? ? ? 计算机渲染流程从硬件上分为CPU(应用阶段)和 GPU(渲染阶段)。
? ? ? ? CPU有三个步骤:把数据加载到显存中,设置渲染状态,调用DrawCall。
? ? ? ? 把数据加载到显存中:渲染流程起步阶段,需要从硬盘把数据传到系统内存中,但是GPU从显存中读取数据与直接读取硬盘中的数据相比,从显存读取是比较快的,并且消耗也是小的。同时,部分的显卡(GPU)不支持直接对硬盘进行数据读取。
? ? ? ? 设置渲染状态:CPU要设置渲染对象的渲染类型,例如:使用哪张纹理,使用什么着色器,是否开启混合等等,设置好之后,CPU将这些信息通过DrawCall命令发出,通知GPU应该依据什么进行渲染显示。
? ? ? ? 调用DrawCall:DrawCall就是包含所有渲染所需的基础信息和命令,从CPU发出,GPU接收,并按照DrawCall中的信息,对渲染对象进行处理和最终显示。
? ? ? ? GPU流水线:顶点数据-->几何阶段-->光栅化阶段-->屏幕图像
? ? ? ? 顶点数据就是CPU通过DrawCall命令发给GPU的数据信息,这些数据会传递给顶点着色器。
? ? ? ? 几何阶段中,包含顶点着色器,曲面部分着色器,几何着色器,裁剪,屏幕映射。这个阶段可以理解为把数据进行一次清洗,通过顶点着色器和曲面部分着色器以及几何着色器,把顶点和图元等信息做好设置,再通过裁剪去除摄像机范围之外的顶点和图元,最终通过屏幕隐射把每个图元的坐标转换到屏幕坐标系中。
? ? ? ? 光栅化阶段中,包含三角形设置,三角形遍历,片元着色器,逐片元操作。这个阶段完成之后,需要绘制的图像信息就已经准备完善了,只需要最终显示到屏幕上。
? ? ? ? 屏幕图像,显示最终成品图像到屏幕上。
2、对于学习Shader数学基础的了解
? ? ? ? Shader中常使用的数据是矢量和矩阵(线性代数),矢量在shader中常常用来判断位置信息和坐标信息,而矩阵是用来帮助进行坐标空间转换。(由于目前也是在初学阶段,后续根据实际的学习情况会做填充)
? ? ? ? 点:点在n维空间中是一个非常基础且必须的元素,一般用来表示位置,没有大小。宽度等概念,是空间表示的基础。
? ? ? ? 矢量:矢量是空间中一种有模,有方向的有向线段。模指的是大小,例如速度,距离等。对应的有一个标量的概念,标量只有模,没有方向。
? ? ? ?
? ? ? ? 矢量加法:
? ? ? ? ? ? ? ? 公式:a+b = (ax + bx,ay + by,az + bz)
? ? ? ? ? ? ? ? 图形学:用来处理矢量的位移操作。
? ? ? ? ? ? ? ? 几何意义:从向量a头连接到向量b尾,表示相加后的矢量。
? ? ? ? 矢量减法:
? ? ? ? ? ? ? ? 公式:a-b = (ax - bx,ay - by,az - bz)
????????????????图形学:用来处理矢量的位移操作。
? ? ? ? ? ? ? ? 几何意义:从向量a尾连接到向量b尾,表示相减后的矢量。
????????要想计算点b相对于点a的位移,可以把b和a相减得出。
? ? ? ? 矢量的模:
? ? ? ? ? ? ? ? 公式:|v| = √v2x + v2y + v2z
? ? ? ? ? ? ? ? 单位矢量公式:v = v/|v|
? ? ? ? ? ? ? ? 几何意义:可以根据二维矢量,构建出一个三角形。
? ? ? ? ? ? ? ? 图形学:矢量在空间中的长度。(这里有疑问,大佬可在下方评论,感谢!)
? ? ? ? ? ? ? ? shader应用:关注点重在于矢量的方向,一般在计算顶点的法线方向和光源方向
??????????????????????????????????????时,会计算单位矢量(归一化的矢量,即模为1)。
????????点乘:
? ? ? ? ? ? ? ? 公式:a · b = |a|·|b|cos<a,b>? 取值范围为【0,180】
? ? ? ? ? ? ? ? 性质:a·b=b·a? 满足乘法交换律
? ? ? ? ? ? ? ? 几何意义:a·b,即为b在a上的投影,并乘以a的长度,值是一个标量。
????????????????图形学:方向判断。点乘>0方向朝向相近,点乘<0方向相反,点乘=0垂直。
? ? ? ? ? ? ? ? unity应用:a·b,在unity中,简单理解为点乘判断角度。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1、计算两个向量的夹角。<a,b> = arccos(a·b/(|a| · |b|))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2、计算夹角范围。>0 (0,90)? <0(90,180)
? ? ? ? 叉乘:
? ? ? ? ? ? ? ? 公式:c = a × b? ?(a,b,c均为向量)
? ? ? ? ? ? ? ? 性质:1、c⊥a,c⊥b,即向量c与向量a,b所在的平面垂直。
? ? ? ? ? ? ? ? ? ? ? ? ? ?2、模长|c| = |a||b|sin<a,b>
? ? ? ? ? ? ? ? ? ? ? ? ? ?3、数学上满足右手法则,a×b = -b×a。
? ? ? ? ? ? ? ? 几何意义:a×b,得到一个与这两个向量都垂直的向量,这个向量的模是以两个向
??????????????????????????????????量为边的平行四边形的面积。
? ? ? ? ? ? ? ? 图形学:二维空间判断左右,三位空间求法向量。(法向量即法线)
? ? ? ? ? ? ? ? unity应用:a×b,在unity中,简单理解为叉乘判断方向。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1、a×b > 0 顺时针,< 0 逆时针,= 0 平行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2、得出夹角的正弦值,计算向量的夹角(0,90),配合点乘和Angle方法计
??????????????????????????????????????算含正负的方向。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3、得出a,b向量形成的平行四边形的面积大小,得出c向量的相对大
??????????????????????????????????????小。
? ? ? ? 矩阵旋转:
? ? ? ? ? ? ? ? X轴旋转矩阵:
????????????????
? ? ? ? ? ? ? ? Y轴旋转矩阵:
?????????????????
? ? ? ? ? ? ? ? Z轴旋转矩阵:
?????????????????
? ? ? ? 矩阵缩放:
????????????????
? ? ? ? 矩阵位移:
????????????????
? ? ? ? ? 有关于矩阵的知识点需要系统的去了解和学习,这里仅仅是列出在shader运算过程中会用到的一些矩阵。
3、坐标空间
? ? ? ? 模型空间:模型空间主要是以模型或对象为原点进行位置确定的空间。
? ? ? ? 世界空间:世界空间是以一个被定义好的绝对位置为原点,然后进行位置确认的空间。
? ? ? ? 观察空间(摄像机空间):以摄像机或观察点为原点,进行位置确认的空间。
? ? ? ? 裁剪空间:以摄像机的视椎体为范围,进行空间划分的空间。
? ? ? ? 屏幕空间:把视锥体投影到屏幕的空间,用于把三维坐标转换成二维坐标,进行像素点确认的空间。
5、Shader光照篇 -- 中级
? ? ? ? 更新中。。。
6、Shader实例篇 -- 高级
? ? ? ? 更新中。。。
7、Shader拓展?
? ? 更新中。。。