目录
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| = √v²x + v²y + v²z
单位矢量公式: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、坐标空间
模型空间:模型空间主要是以模型或对象为原点进行位置确定的空间。
世界空间:世界空间是以一个被定义好的绝对位置为原点,然后进行位置确认的空间。
观察空间(摄像机空间):以摄像机或观察点为原点,进行位置确认的空间。
裁剪空间:以摄像机的视椎体为范围,进行空间划分的空间。
屏幕空间:把视锥体投影到屏幕的空间,用于把三维坐标转换成二维坐标,进行像素点确认的空间。
4、Shader初体验 -- 初级
5、Shader光照篇 -- 中级
更新中。。。
6、Shader实例篇 -- 高级
更新中。。。
7、Shader拓展
更新中。。。