您的位置:首页 > 移动开发 > Unity3D

Unity_Shader学习(一) 基础篇

2019-01-18 21:14 211 查看

本系列学习是以冯乐乐学姐编写的《UnityShader入门精要》为基础资料来学习的。据隔壁学霸介绍,此书有很多实用Shader而且讲解细致,所以在这里也向大家推荐一下。

 

计算机图像是通过渲染流水线的方式进行渲染的:分为应用阶段,几何阶段,光栅化阶段。(每个阶段本身通常也是一个子流水线)

 

应用阶段:

由CPU负责实现,分三步:

(1)把数据加载到显存当中。这一步是因为显卡访问显存的速度很快。

(2)设置渲染状态。这些渲染状态定义了场景中的网格是怎样被渲染的,使用哪种光源,材质等等。

(3)调用DrawCall。DrawCall是一个CPU发送给GPU的命令,它指向要被渲染的图元。

 

几何阶段:

由GPU负责实现,分以下步骤:

(1)顶点着色器。根据应用阶段输出的顶点信息,对每个顶点调用一次顶点着色器,主要工作为坐标变换和逐顶点光照。其基本工作是把顶点坐标从模型空间变换到裁剪空间。

(2)曲面细分着色器。

(3)几何着色器。

(4)裁剪。对部分在视野内的图元进行裁剪,用边界交点代替视野外的顶点。

(5)屏幕映射。三维变二维的一步操作,把场景渲染到窗口上。

 

光栅化阶段:(基于图元计算像素)

(1)三角形设置。由于几何阶段的输出是顶点信息,我们要基于顶点信息计算三角网格。

(2)三角形遍历。根据三角网格覆盖像素的情况获取片元。一个片元是很多状态的集合(坐标,深度等),它不是真正意义上的像素。

(3)片元着色器。

(4)逐片元操作。输出合并的阶段,片元经过模板测试,深度测试,混合之后输出到颜色缓冲区。

模板测试:

深度测试:

混合:

数学基础:

点乘:a·b=(a1,a2,a3)·(b1,b2,b3)=a1·b1+a2·b2+a3·b3

叉乘:aXb=(a1,a2,a3)X(b1,b2,b3)=(a2b3-a3b2, a3b1-a1b3, a1b2-a2b1)

逆矩阵:只有方阵才有逆矩阵,且MN=NM=I,I为单位矩阵,N是M的逆矩阵

正交矩阵:矩阵M与它的转置矩阵的乘积为单位矩阵,我们就说这个矩阵M是正交的。正交矩阵的每一行是一个单位矢量且这些矢量互相垂直。

变换矩阵:对向量进行变换操作,如:平移,缩放,旋转的矩阵。

平移矩阵:平移量为x,y,z

[1,0,0,x

0,1,0,y

0,0,1,z

0,0,0,1]

缩放矩阵:缩放因子为a,b,c

[a,0,0,0

0,b,0,0

0,0,c,0

0,0,0,1]

旋转矩阵:绕x轴旋转i度

[1,0,0,0

0,cos(i),-sin(i),0

0,sin(i),cos(i),0

0,0,0,1]

绕y轴旋转k度

[cos(k),0 ,sin(k),0

0,1,0,0

-sin(k) ,0,cos(k),0

0,0,0,1]

绕z轴旋转j度

[cos(j) ,-sin(j),0,0

sin(j) ,cos(j),0,0

0,0,1,0

0,0,0,1]

一般操作步骤为先缩放,后旋转,最后平移。可以得到复合矩阵:

[acos,0,asin,x

0,b,0,y

-csin,0,ccos,z

0,0,0,1]

 

如果变换一个矢量需要使用变换矩阵M,则对其法线向量的变换需要使用M的逆转置矩阵

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: