Shader的语法
(1)Properties:{ Property [Property ...] }
属性列表,如color、texture、float等。
name ("display name", Range (min, max)) = number
name ("display name", Color) = (number,number,number,number)
name ("display name", 2D) = "name" { options } 定义2D纹理属性
name ("display name", Rect) = "name" { options } 定义长方形(非2次方)纹理属性
name ("display name", Cube) = "name" { options }
name ("display name", Float) = number
name ("display name", Vector) = (number,number,number,number)
在Unity中, name通常使用下划线開始的命名方式。
在着色器中,属性值通过[name]来訪问相应的属性。
texture的大括号里能够设置:TexGen(ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal)、LightmapMode。
Properties { // properties for water shader // 水着色器的属性 _WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders _ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5 _RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4 _RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // color _ReflectionTex ("Environment Reflection", 2D) = "" {TexGen EyeLinear} // textures _RefractionTex ("Environment Refraction", 2D) = "" {} _Fresnel ("Fresnel (A) ", 2D) = "" {} _BumpMap ("Bumpmap (RGB) ", 2D) = "" {} }
(2)Subshaders:Subshader { [Tags] [CommonState] Passdef [Passdef ...] }
至少有一个,当载入一个着色器时。Unity将遍历这个列表,获取第一个能被用户机器支持的着色器。
(2.1)Tags:Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
渲染排序队列Rendering Order - Queue tag,eg:"Queue" = "Transparent"
有四种提前定义的渲染队列,在提前定义队列之间还能够定义很多其它队列:
Background:1000。后台,天空盒
Geometry (default):2000,不透明的物体
Alpha Test:2450
Transparent:3000。透明,全部的alphe blend
Overlay:4000,覆盖,不论什么须要最后渲染的对象应该放置在此处,如镜头光晕
忽略投影标签:"IgnoreProjector" = "True"
假设设置忽略投影标签为"True",那么使用这个着色器的对象将不会被投影机所影响。
对半透明的物体来说最实用处,由于没有对他们产生投影的好办法。
假设设置忽略投影标签为"True",那么使用这个着色器的对象将不会被投影机所影响。对半透明的物体来说最实用处,由于没有对他们产生投影的好办法。
ForceNoShadowCasting,值为"true"时,表示不接受阴影。
RenderType标签:Unity能够执行时替换符合特定RenderType的全部Shader。
Camera.RenderWithShader或者Camera.SetReplacementShader配合使用。
Unity内置的RenderType包含:
Opaque:绝大部分不透明的物体都使用这个;
Transparent:绝大部分透明的物体、包含粒子特效都使用这个;
Background:天空盒都使用这个;
Overlay:GUI、镜头光晕都使用这个;
Shader "Transparent Queue Example" { SubShader { Tags {"Queue" = "Transparent" "RenderType" = "Opaque"} Pass { // rest of the shader body... } } }
(2.2)Pass:Pass { [Name and Tags] [RenderSetup] [TextureSetup] }
一个pass代表一次渲染过程
(2.2.1)Name:一个通道能被赋予一个名字以便UsePass 命令能索引到它,全部通道名字都是大写开头。
(2.2.2)Tags:Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
LightMode光照模式标签:Always,ForwardBase,ForwardAdd,PrepassBase,PrepassFinal,Vertex,VertexLMRGBM,VertexLM,ShadowCaster,ShadowCollector
RequireOptions须要选项标签:当一些外部条件得到满足时 这个pass才渲染,这是通过使用RequireOptions标签,它的值是一个空格切割的字符串,眼下由Unity3d支持的选项是:SoftVegetation
(2.2.3)Render Setup渲染设置
Material { Material Block } 定义一个使用顶点光照管线的材质:Diffuse Ambient Specular Shininess Emission(自发光颜色,当不被不论什么光照所照到时,对象的颜色)
Lighting On | Off 开启或关闭顶点光照
Cull Back | Front | Off 剔除模式
ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) 深度測试模式
ZWrite On | Off 深度写模式
Fog { Fog Block } 雾參数
AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue 开启alpha測试
Blend SourceBlendMode DestBlendMode alpha混合模式
Color Color value 当顶点光照关闭时所使用的颜色
ColorMask RGB | A | 0 | any combination of R, G, B, A 颜色写遮罩。设置为0将关闭全部颜色通道的渲染
Offset OffsetFactor , OffsetUnits 深度偏移
SeparateSpecular On | Off 开启或关闭顶点光照相关的平行高光颜色。这个命令会加入高光光照到着色器通道的末尾。因此贴图对高光没有影响。仅仅在光照开启时有效。
ColorMaterial AmbientAndDiffuse | Emission 当计算顶点光照时使用每顶点颜色
(2.2.4)Texture Setup纹理设置 SetTexture texture property { [Combine options] }
在完毕渲染设定后,你能指定一定数量的纹理和当使用 SetTexture 命令时所採用的混合模式,
纹理设置配置了固定函数多纹理管线,当使用自己定义fragment shaders时,将忽略这个设置。
(2.3)UsePass:UsePass "Shader/Name"
使用来自还有一个着色器的命名通道,仅仅有命名了的Pass才干被引用。
(2.4)GrabPass:有两种语法:
GrabPass { }
能捕获当前屏幕的内容到一个纹理中。纹理能在兴许通道中通过 _GrabTexture 进行訪问。
GrabPass { "TextureName" }
(3)Fallback:假设没有子着色器被支持。Unity将尝试使用Fallback制定的着色器(降级shader)。
(4)Category:用于设置全部SubShader都会继承的渲染状态,效果和直接复制粘贴到每一个subshader中一样。
Shader "example" { Category { Fog { Mode Off } Blend One One SubShader { // ... } SubShader { // ... } // ... } }
(5)RenderSetting渲染设置。能够设置fog參数、环境光參数等。
fog的參数:模式Mode Off | Global | Linear | Exp | Exp2。颜色Color ColorValue。强度Density FloatValue,范围Range FloatValue , FloatValue
雾化是通过混合已生成的像素的颜色和基于到镜头的距离来确定的一个不变色来完毕。
雾化不会改变已经混合的像素的透明度值。仅仅是改变RGB值。
缺省雾设定基于渲染设置。
开启雾效通经常使用于优化性能。雾能够让远处的物体淡出而不进行绘制。
不要低估细致调整渲染设置后为游戏带来的视觉冲击力。
渲染设置是针对每一个场景的,每一个场景都能够有不同的渲染设置。