Unity3D的着色器介绍(二)——Unity3D的Shader基本结构说明

上一篇着色器介绍文章,阿赵我大概的说明了一下软渲染的过程,用于解释着色器的基本工作流程,不知道看过的人是否能知道阿赵想说什么呢?原理的东西基本都是通用的,所以可以说上一篇文章和Unity本身是没什么直接关系的。
接下来说点和Unity有关的东西,比如说在Unity里面的Shader应该怎样写,从哪里下手?要不先说一下Shader的基本结构吧。
Unity3D里面有三种Shader的类型:
- fixed function shader
- vertex and program shader
- surface shader 
这三种Shader的区别,我打算在下一篇文章里面再说,现在我们先看一看通用的一些结构。
随便打开一个Unity自带或者你从网上下载的Shader文件,你可以看到大概的结构都是像下面这样的:

标准shader的结构:
// 着色器名称
Shader "MyShader" {

// 参数
    Properties {
        _MyTexture ("My Texture", 2D) = "white" { }
        // 继续添加其他的参数
    }

// 子着色器,从上而下的运行
    SubShader {
        // 着色器主体可以是
        //  - surface shader 或者
        //  - vertex and program shader 或者
        //  - fixed function shader
    }
    SubShader {
        // 这里可以写一个相对简单的子着色器,让比较旧的显卡也能运行
    }

着色器结构说明:
从上面的结构例子可以看出,着色器由着色器名称、参数和子着色器三部分构成。
着色器名称:用于查找着色器时的名称
参数:决定了在材质栏里面显示的可选输入参数,比如贴图、颜色等
子着色器:是着色器的主体,负责输入、计算和输出。


名称就没什么好讲的地方了,定好名称之后,这个着色器就会在相应的shader目录下面出现,当然在其他代码里面调用,你也可以通过Shader.Find来找到对应名称的shader。

参数部分可以做一下解释:
格式:_Name(“Display Name”,type) = defaultValue{options}
解释:
1、变量类型:
Color:颜色,RGBA
赋值举例:(1,1,1,1)

2D:贴图
Rect:长宽为2的次方的贴图

Cube:立方体纹理
赋值举例:字符串,比如””、”white”、”black”、”gray”、”bump”

2、贴图可选option:
TexGen:自动生成一些特定的UV纹理特效,主要用于Fixed Function Shader。注意,如果使用了顶点程序,TexGen将会被忽略
ObjectLinear、EyeLinear、SphereMap、CubeReflect、CubeNormal
举例:_MainTex ("Base (RGB)", 2D) = "white" {TexGen EyeLinear}

LightmapMode :如果设定了,这个贴图将会per-render时的光照贴图参数,意思是这个贴图不在材质里面用,而是从渲染设置代替

Range(min,max):介于最大值和最小值之间范围的浮点数
Float:浮点数
赋值举例:浮点数

Vector:四维数
赋值举例:(x,y,z,w)


子着色器SubShader解释
1、标签(Tags)
1.SubShader Tags
写法:
写在SubShader的第一句
Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
比如
Tags { "RenderType"="Opaque" }

标签类型:
Queue:渲染队列,控制渲染的顺序。
参数:
Background :最先渲染的类型,一般用作背景和天空盒
Geometry :默认类型,第二渲染
AlphaTest :第三渲染,透明度测试
Transparent :第四渲染,半透明显示
Overlay :最后渲染叠加的内容
以上的参数控制顺序是靠各自的值来排序的:
Background is 1000, Geometry is 2000, AlphaTest is 2450, Transparent is 3000 and Overlay is 4000
所以如果想再细分渲染的顺序,可以Tags { "Queue" = "Geometry+1" },如此类推

RenderType :渲染类型,基本是用于Shader Replacement时候的标签
参数:
?Opaque: most of the shaders (Normal, Self Illuminated, Reflective, terrain shaders). 
?Transparent: most semitransparent shaders (Transparent, Particle, Font, terrain additive pass shaders). 
?TransparentCutout: masked transparency shaders (Transparent Cutout, two pass vegetation shaders). 
?Background: Skybox shaders. 
?Overlay: GUITexture, Halo, Flare shaders. 
?TreeOpaque: terrain engine tree bark. 
?TreeTransparentCutout: terrain engine tree leaves. 
?TreeBillboard: terrain engine billboarded trees. 
?Grass: terrain engine grass. 
?GrassBillboard: terrain engine billboarded grass. 

ForceNoShadowCasting:强制不产生阴影。
参数:true

IgnoreProjector:忽略投影
参数:true
当设置为true时,该物体本身就不接受灯光投影


2.Pass Tags
区别于SubShader Tags,Pass Tags是写在pass内部的
标签类型:
1)LightMode tag
控制渲染管线里面的灯光管线
具体参数:
?Always: Always rendered; no lighting is applied. 
?ForwardBase: Used in Forward rendering, ambient, main directional light and vertex/SH lights are applied. 
?ForwardAdd: Used in Forward rendering; additive per-pixel lights are applied, one pass per light. 
?PrepassBase: Used in Deferred Lighting, renders normals & specular exponent. 
?PrepassFinal: Used in Deferred Lighting, renders final color by combining textures, lighting & emission. 
?Vertex: Used in Vertex Lit rendering when object is not lightmapped; all vertex lights are applied. 
?VertexLMRGBM: Used in Vertex Lit rendering when object is lightmapped; on platforms where lightmap is RGBM encoded. 
?VertexLM: Used in Vertex Lit rendering when object is lightmapped; on platforms where lightmap is double-LDR encoded (generally mobile platforms & old dekstop GPUs). 
?ShadowCaster: Renders object as shadow caster. 
?ShadowCollector: Gathers object's shadows into screen-space buffer for Forward rendering path. 


2)RequireOptions tag
某些pass需要在质量设置里面开启了对应的设置,才会渲染。比如SoftVegetation

2、渲染设置
1.LOD级别
假如设定LOD级别(默认时是200),我们可以在质量控制里面设置某个质量级别能支持的最大LOD级别。如果设定支持的lod级别比shader需要的级别低,那该shader就不可用。
参考网上的资料:
VertexLit及其系列 = 100
Decal, Reflective VertexLit = 150
Diffuse = 200
Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
Bumped, Specular = 300
Bumped Specular = 400
Parallax = 500
Parallax Specular = 600

2.Material { Material Block }
这个模块控制了顶点光照的信息,包括漫反射、高光、环境光等
Diffuse: Color
默认颜色组件,基本颜色
Ambient: Color
环境颜色组件,物体在被RenderSettings里面设置的环境光照射时的颜色
Specular: Color
高光反射颜色
Shininess: Number
高光的锐利度,在0到1之间,0时高光巨大,1时高光尖锐。
Emission: Color
自发光,当物体没有被任何光线照射时的颜色。

最终颜色:
Ambient * RenderSettings ambient setting +
  (Light Color * Diffuse + Light Color * Specular) + Emission

3.Lighting On | Off
控制顶点光照的开关

4.Cull Back | Front | Off
控制剔除的面

5.ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)
深度测试模式,小于、大于、小于等于、大于等于、等于、不等于、一直时,才显示。

6.ZWrite On | Off
深度写入的开关

7.Fog { Fog Block }
这个模块可以给物体单独设置雾的效果。
示例:
Fog
{
Mode Exp2//Off | Global | Linear | Exp | Exp2
Color [_Color]
Density 0.1
Range 0,300
}

8.AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue
透明度测试,小于、大于、小于等于、大于等于、等于、不等于某值时显示

9.Blend SourceBlendMode DestBlendMode
设置混合模式。
? One  The value of one - use this to let either the source or the destination color come through fully. 
? Zero  The value zero - use this to remove either the source or the destination values. 
? SrcColor  The value of this stage is multiplied by the source color value. 
? SrcAlpha  The value of this stage is multiplied by the source alpha value. 
? DstColor  The value of this stage is multiplied by frame buffer source color value. 
? DstAlpha  The value of this stage is multiplied by frame buffer source alpha value. 
? OneMinusSrcColor The value of this stage is multiplied by (1 - source color). 
? OneMinusSrcAlpha The value of this stage is multiplied by (1 - source alpha). 
? OneMinusDstColor The value of this stage is multiplied by (1 - destination color). 
? OneMinusDstAlpha The value of this stage is multiplied by (1 - destination alpha). 

常用的混合模式:
Blend SrcAlpha OneMinusSrcAlpha     //透明混合
Blend One One                       // 叠加
Blend OneMinusDstColor One          // 软叠加
Blend DstColor Zero                 // 相乘
Blend DstColor SrcColor             // 2x 相乘


10.Color Color value
当Light off时设置颜色

11.ColorMask RGB | A | 0 | any combination of R, G, B, A
过滤颜色,如果参数是RGB的一种或几种时,将过滤参数的颜色,如果是0,将过滤所以颜色

12.Offset OffsetFactor , OffsetUnits
设置Z缓存深度偏移

13.SeparateSpecular On | Off
控制顶点光照的高光开关,如果开了,那么在物体最终颜色基础上再加上高光颜色

14.ColorMaterial AmbientAndDiffuse | Emission
使用材质颜色代替环境光、漫反射或者自发光

以上等于是说明书一样把用到的设置项都列举了一下,具体用途其实是在用到的时候,可以直接查看一下。
看完名称、参数和子着色器的解释之后,再去看其他人写的shader,应该就比较能清楚大概是什么意思了吧?
下一次的内容将会是三种不同类型的着色器程序(fixed function shader、 vertex and program shader、 surface shader) 的区别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值