Shader学习指北

开始:创建一个shader脚本

unity自带的shader脚本有四个
在这里插入图片描述

  • Standard Surface Shader(标准表面着色器):最标准的初始着色器。(一般都用这个)
    这个Shader模板的脉络很清晰,先是定义一些属性,然后在SubShader中设置渲染模式,层次细节LOD的值,然后开启一个CG编程语言模块,写一些编译指令#pragma,声明一下变量让属性值在CG块中可见,定义输入结构,然后填充一下表面着色函数即可。
    注意:SurfaceShader不能使用Pass通道,一使用就报错,有需要的话直接在SubShader中实现和填充代码就可以了。

  • Unlit Shader(无光照着色器):它是一个不包含光照(但包含雾效)的基本顶点/片元着色器。
    Unlit Shader,简单来说,就是直接采用漫反射纹理,不考虑场景中的任何灯光效果。使用无灯光着色器的话,也就不能使用任何镜面或者法线效果了。Unlit系的Shader基本原理和其他Shader无异,但是计算量更小,更快速,更高效。

  • Image Effect Shader(图像特效着色器) :主要用于渲染图像Shader。
    这里的图像特效一般指的就是屏幕图像特效,在Camera加上各种滤镜,比如说屏幕溅血,像素化,色调的调整,画面模糊等效果。其也是一个顶点&片段着色器,且一般主要的操作集中在片段着色函数中。

  • Compute Shader(计算着色器):是在正常渲染之外在图形卡上运行的程序管道。(不经常用,这里不再赘述)

Properties部分

一、Properties属性

在Properties{}语句块中定义了着色器属性,在这里定义的属性将被作为输入提供给所有的子着色器。就和在C#脚本中定义一些int值一样。
定义语法为:
_Name("Display Name", type) = defaultValue[{options}]

  • _Name - 属性的名字,简单说就是变量名,在之后整个Shader代码中将使用这个名字来获取该属性的内容
  • Display Name - 这个字符串将显示在Unity的材质编辑器中作为Shader的使用者可读的内容
  • type - 这个属性的类型,可能的type所表示的内容有以下几种:
    • Color - 一种颜色,由RGBA(红绿蓝和透明度)四个量来定义;
    • 2D - 一张2的阶数大小(256,512之类)的贴图。这张贴图将在采样后被转为对应基于模型UV的每个像素的颜色,最终被显示出来;
    • Rect - 一个非2阶数大小的贴图;
    • Cube - 即Cube maptexture(立方体纹理),简单说就是6张有联系的2D贴图的组合,主要用来做反射效果(比如天空盒和动态反射),也会被转换为对应点的采样;
    • Range(min, max) -
      一个介于最小值和最大值之间的浮点数,一般用来当作调整Shader某些特性的参数(比如透明度渲染的截止值可以是从0至1的值等);
    • Float - 任意一个浮点数;
    • Vector - 一个四维数;
  • defaultValue定义了这个属性的默认值,通过输入一个符合格式的默认值来指定对应属性的初始值(某些效果可能需要某些特定的参数值来达到需要的效果,虽然这些值可以在之后在进行调整,但是如果默认就指定为想要的值的话就省去了一个个调整的时间,方便很多)。
    • Color - 以0~1定义的rgba颜色,比如(1,1,1,1);
    • 2D/Rect/Cube -对于贴图来说,默认值可以为一个代表默认tint颜色的字符串,可以是空字符串或者"white",“black”,“gray”,"bump"中的一个
    • Float,Range - 某个指定的浮点数
    • Vector - 一个4维数,写为 (x,y,z,w)
  • {option},它只对2D,Rect或者Cube贴图有关,在写输入时我们最少要在贴图之后写一对什么都不含的空白的{},当我们需要打开特定选项时可以把其写在这对花括号内。如果需要同时打开多个选项,可以使用空白分隔。可能的选择有ObjectLinear,
    EyeLinear, SphereMap, CubeReflect,
    CubeNormal中的一个,这些都是OpenGL中TexGen的模式,具体的留到后面有机会再说。

示例:

_MainColor ("Main Color", Color) = (0,0,0,0)
_Texture ("Texture", 2D) = "white" {} 
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07
_ReflectionTex ("Environment Reflection", 2D) = "" {}

这两句话的意思是:
定义了一个_MainColor属性,在面板中显示为Main Colo,他的类型是Color,默认为(0,0,0,0)(纯黑色)
定义了一个_Texture属性,在面板中显示为Texture,他的类型是2D图片,默认为white(白色)
定义了一个_WaveScale 属性,在面板中显示为Wave scale,他的类型是Range (0.02,0.15),默认为0.07
定义了一个_ReflectionTex 属性,在面板中显示为Environment Reflectio,他的类型是2D图片,默认为空

SubShader部分

二、Tags标签

Tags标签是一个键值对,键和值都是字符串类型。Tags标签的作用是告诉渲染引擎,什么时候、怎么样调用这个SubShader。
注意:它只能写在 Subshader 语句块里面,不能写在 Pass 语句块里面。

1.一些常用的Tags渲染队列标签:

(1)Queue:指定渲染顺序,指定该物体属于哪一个渲染队列,例如Tags{“Queue” = “Transparent”}
(2)RenderType:对着色器分类。例如:这是一个不透明着色器,例如 Tags{“RenderType” = “Opaque”}
(3)DisableBatching: 一些SubShader在使用Unity批处理时会出现问题。可以用该标签直接表明是否使用批处理,例如Tags{“DisableBatching” = “True”}
(4)ForecNoShadowCasting:控制该SubShader的物体是否会投射阴影,例如Tags{“ForceNoShadowCasting” = “True”}(从不产生阴影)
(5)IgnoreProjector

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值