Shader
这是国外一个很详细的Shader入门基础网址UnityGames 当然国内也有翻译UnityGames翻译 还有就是猫都能学会的Shader入门指南
- 零基础自学shader,有基础的同学勿喷,楼主最喜欢-- 打破沙锅问到底,杜绝任何一个只是盲区。所以现阶段主要在于shader的理论。我们Unity里面用什么语言编写Shader呢,现在总共有3种语言可以编写Shader代码。
- Cg(C for Graphic,NVIDIA推出的,已经不更新了)。
- HLSL(High Level Shading Language,微软的Direct推出,用于win平台,对手:OpenGL)。
- GLSL(OnpenGL Shading Language,OpenGL推出,对手Direct3D)
- 然后,因为Microsoft和NVIDIA合作,所以Cg/HLSL实际上是同一种语言
- ShaderLab语言,这个东西只是为Unity Shader服务的语言,目的就是让shader编程更加简单,但是,Unity为了最大化的跨平台支持,选择重点支持HLSL,在实际使用中很多时候HLSL和CG是一样的。需要嵌套在命令CGPROGRAM和ENDCG之间。还有就是CGINCLUDE(与CGPROGRAM这俩不一样)代码块会被插入到每一个Pass中,因此我们可以把Pass中的公共的字段,结构和方法等声明在CGINCLUDE代码块中。
- shader中文名叫着色器,顾名思义,它的作用可以先简单理解为给屏幕上的物体画上颜色。而什么东西负责给屏幕上画颜色?当然是GPU,所以我们写shader的目的就是告诉GPU往屏幕怎么画。然后就是一些固定代码结构,比如说Properties是什么,SubShader是什么,Pass等等。当然想要学shader,楼主以为是这样一个过程:首先.需要搞懂Shader是干啥的。从基础的开始,shader代码关键字是什么意思,尽管你不知道它能在这个shader里面起到什么作用,比如说这一行: 他是将当前subshader的所有pass的渲染队列设为”Geometry+1“层,为什么要这么设置呢,后面再说。有了这些理论知识,拿到shader代码,至少不会一脸蒙逼。其次.不仅仅需要理论知识,看代码是必须的,要知道别人写的这个shader代码是什么意思,有什么作用,这里就不能像前面的知其然不知其所以然了,不仅要知道这句话是什么意思,还要知道为什么要这样写,写了这句话能出来什么效果,所以第二阶段就是读代码。最后.准备工作做好了,就需要上手了,从简单的开始写,熟能生巧就可以了。文章中有理解错误的,下面就是第一阶段,请大家多多指教。
- 在unity中新建一个shader(Stander Surface Shader),然后在vs中打开,代码结构如下:
- 代码解释 所有shader代码必须由Shader “shader路径” { } 包括在里面. 上面乱糟糟的代码提取出来是这个样子
- Properties{…} 指的是本shader定义的属性,类似于C#中的定义int,string等字段,定义自己需要的属性字段,定义属性的格式为:_Name (“display name”, 属性类型(type)) = “name” { options } :
- _Name---------------属性的名字,简单说就是变量名,在之后整个Shader代码中将使用这个名字来获取该属性的内容
- display name ----- Inspector面板显示的名称
- type ------这个属性的类型有以下几种:
- Color ------一种颜色,由RGBA(红绿蓝和透明度)四个量来定义;
- 2D ----- 一张2的阶数大小(256,512之类)的贴图。这张贴图将在采样后被转为对应基于模型UV的每个像素的颜色,最终被显示出来;
- Rect ----- 一个非2阶数大小的贴图;
- Cube ----- 即Cube map texture(立方体纹理),简单说就是6张有联系的2D贴图的组合,主要用来做反射效果(比如天空盒和动态反射),也会被转换为对应点的采样;
- Range(min, max) - 一个介于最小值和最大值之间的浮点数,类似滑动条(比如透明度渲染的截止值可以是从0至1的值等);
- Float - 任意一个浮点数;
- Vector - 一个四维数;
- 提示: 其中每一个类型还可以设置默认值,如下:
- Color 的默认值 - - 以0~1定义的rgba颜色,比如(1,1,1,1);
- 2D/Rect/Cube - - 对于贴图来说,默认值可以为一个代表默认tint颜色的字符串,可以是空字符串或者"white",“black”,“gray”,“bump”,“red”,"empty string"中的一个,
- Float,Range - - 某个指定的浮点数
- Vector - - 一个4维数,写为 (x,y,z,w)
- 另外还有一个{option},它只对2D/Rect/Cube贴图有关,在写输入时我们最少要在贴图之后写一对什么都不含的空白的{},当我们需要打开特定选项时可以把其写在这对花括号内。如果需要同时打开多个选项,可以使用空白分隔。可能的选择有ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal中的一个,这些都是OpenGL中TexGen的模式,
- SubShader{…} 最基础的解释就到这里,具体怎么用后面会写到。
- 下一篇写SubShader{…} 的相关基础 Unity Shader 详细自学(二)