咨询电话:400-810-1418服务与监督电话:400-006-6572

Shader小白入门基础教程

发布时间:2020-02-25 12:37:57

Hello,大家好!针对一些读者要求,以及想在材质等表现上更进一步的同志们,今天的便给大家分享这篇Shader小白入门基础教程。

0.jpg

1、shader

着色器,是一种较为简短的程序片段,用于告诉图形软件如何计算和输出图像。shader主要分两类:Vertex Shader(顶点着色器)和Fragment Shader(片段着色器)

2、渲染管线

又叫渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元。一个流水线是一序列可以并行和按照固定顺序进行的阶段,遵循着前入后出的流程。类比来说,就像是一个工厂,同时生产宝马和宾利两种汽车,这两款汽车的每个零件又是同时制作的,就可以说这个车间内有两个不同的渲染管线。

1.jpg

我们根据上图进行说明。3D软件或是游戏在运行的时候,会调用图形API,OpenGL或者是DirectX。而顶点着色器和片段着色器就在图中GPU运算框选部产生作用

2.jpg

上图就是针对到unity引擎中。Geometry部分可以理解为建模,这个过程就是把Mesh数据导入到unity之中,unity引擎再调用图形API,而调用图形API的过程就是在驱动GPU进行处理运算。

进入到GPU后,首先进行的是顶点处理程序(Vertex Processor)对应顶点shader,顶点运算的结果会传递给像素处理器(Pixel Processor相当于片段处理器),其对应的便是像素shader(也就是片段shader),最后输出可以在屏幕上显示的像素信息,即Frame Buffer(帧缓冲),Frame Buffer不仅可以储存颜色信息还可以储存深度值。

3.jpg

3、shader | 材质 | 贴图

着色器实际就是一小段程序,他负责将输入的顶点数据以指定的方式和输入的贴图或者颜色等组合起来,然后进行输出。绘图单元可以以及这个输出来将图像绘制到屏幕上。

输入的贴图或者颜色等,加上对应的shader,以及对shader的特定的参数设置,将这些内容(shader及输入参数)打包储存在一起,得到的就是一个Material(材质),这些包里其实还有其他东西比如向量、矩阵。之后,我们便将材质赋予到三维模型上进行渲染(输出)了

4.jpg

材质,就像是游戏引擎最终使用的商品,shader就好比是生产这种商品的加工方法,而贴图则是这商品的原材料。如果我们不用Unity或是其他引擎的话,实现材质就需要利用OpenGL或是DirectX的API的调用,手动组织出个shader,这样就很麻烦,所以引擎提供了便捷。

4、shader编写的语言

有三种:HLSL、GLSL和CG。以前Shader是用汇编语言进行编写的,难度贼鸡儿大,但是现在可以用这三种高级语言编写就很方便了。HLSL是基于DrectX的、GLSL是基于OpenGL的,还有NVIDIA的C For Graphic,简称CG语言。

其中CG是DX和OpenGL都支持的,也极大保留C语言的语义,CG语法和HLSL很像甚至可以混用,实际上这俩语言是同一种语言了。一般来说为了跨游戏平台方便,一般学CG语言。

5、unity中shader的编写形式

有三种:surface shader | vertex and Fragment shader | fixed function shader。我们知道,硬件只识别顶点着色和片段着色,那么unity引擎中为何还会多出来一个surface shader(以下简称SS)和Fixed Function shader(以下简称FFS)呢。

对于FFS,主要是对于固定管线的硬件的操作,是特别保守的shader能得到绝大部分硬件的支持;而SS呢,是unity推荐用的,创建一个shader在unity中的时候,默认的代码就是SS。实际上SS是对顶点和片段着色器的一种“包装”,在SS编程后unity会将SS代码编译成硬件可识别的顶点和片段着色器代码

书写shader的主要结构:

5.png

6、ShaderLab

ShaderLab是为unity定制的专门用于编写Shader的语法,可以容纳其他三种shader。

shaderLab的主要结构

6.png

花括号内的三个部分:Properties,Subshaders,Fallback

什么是Properties呢,属性。我们在unity中新建一个材质球和一个shader,打开编译器将shader命名为“111”,再将111shader拖拽给材质球,再点击材质球观察其显示与代码中Properties的内容。我们发现,shader编程中的Properties(属性)会让拥有该shader的材质球的属性以列表的形式显示出来,进行参数调节。

7.png8.jpg

subshader是啥呢,算法,就是写给GPU渲染的shader片段了,这里记住,一个shader当中至少有一个subshader。每一次显卡进行处理的时候呢,只能选择其中一个subshader去执行。那为什么会有多个subshader呢?这和硬件有关。

在读取shader的时候,会先从第一个subshader读取,如果第一个能适配当前硬件,就不会往下读了;如果硬件太老跟不上,第一个读取不了,就会读取第二个看能不能与我适配。也就是说,subshader的所有方案会向下简化。如果这些列举的subshader都用不了怎么办?那就是第三个Fallback了

FallBack就是在subshader都用不了的时候可以回滚到指定的unity中一个都能适配的shader。unity常用的内建shader的如下:

9.jpg

以上就是关于shader的入门级别内容,希望能够帮助到看官们。

来源:Thepoly

作者:kinglary