unity shaderlab 的语法基础 ,用来做个人备忘查询
ShaderLab Syntax
Unity中的所有Shader都是用一种叫做"Shader Lab"的陈述性语言(declarative language)写的。在Shader中通过逐层嵌套的大括号来声明包括在材质面板看到的一系列变量、使用的渲染模式、硬件不支持时的fallback等。而真正的"shader代码"夹在CGPROGRAM…ENDCG之间的代码片段。本节就合租要介绍这些嵌套的语法。而真正CGPROGRAM代码段是通过常规的HLSL/Cg 着色器语言完成的。
ShaderLab
Shader “shadername” { [Properties] Subshaders [Fallback] [CustomEditor] }
shadername:
“shadername “是你通过inspector面板为材质选择shader时看到的名字,可以用”/“生成类似二级三级菜单的形式,例如” custom/example”
Properties:
shader中用到的一些额外参数,可以在材质的inspcector面板中看到,例如颜色,贴图等
Subshaders:
每一个Shder都是由一个或者多个sub-shader组成的。当加载一个shader的时候,unity 会从头遍历这一系列的subshader,并且选择设备支持的第一个宿便是的人。如果没有可用的subshaders,untiy就会选择fallback shader。
如果你想让你的游戏在最新的显卡上有完美的表现,有不想游戏只能让这些有高级显卡的玩家体验,就要编写多个subshader。
Shader层面的"level of detail (LOD)"和"shader replacement"是两项依赖于subshader的技术
Exampler
// colored vertex lighting Shader “Simple colored lighting”
{
// a single color property
Properties {
_Color (“Main Color”, Color) = (1,.5,.5,1) }
// define one subshader
SubShader
{
// a single pass in our subshader
Pass {
// use fixed function per-vertex lighting
Material {
Diffuse [_Color] } Lighting On
}
}
}
ShaderLab : Properties
Shader 可以定义各种各样的参数来让美术在unity 材质球的inspector面板中通过调整参数来进行创作。
Syntax: Properties{ Property[Property …]}
数值和滑动条
变量名 (“inspector 中显示的名字” ,Range(min,max))=default value //显示为滑动条
name (“display name” ,Float)=default value
name (“display name”,Int)=default
颜色和矢量
name (“display name” ,Color)=(1,1,1,1) //默认的(r g b a)值
name (“display name”,Vector)=(0,0,0,0) //默认的(x y z w)值
贴图
name(“display name”,2D)=“default texture” {} //2D texture
name (“display name”,Cube)=“default texture”{} //cubemap
name(“display name”,3D)=“default texture” {} //3D(volume)
细节
shader 中自定义的变量通过 “name"字段引用,而且在unity中我们通常以下划线作为自定义变量的开头,例如”_MainTex"。在material inspector面板中显示的名字则是"display name",所以display name可以为中文例如 “法线贴图”。
对于Range 、Float、Color和Vector这些变量的默认值可以直接用数字描述
而对于Texture(2D ,Cube)默认值可以是空字符串也可以是内置的贴图名字如:“white”,“black”,“gray” or “bump”
在固定功能shader中可以直接通过变量名来获取变量的值,而SurfaceShader 以及vertex &fragment shader中需要额外声明一次
变量名前面可以添加用中括号括起来的描述性属性
[HideInInspector]
[NoScaleOffset] -用来修饰贴图变量,在inspcetor 面板中不再显示该贴图的tilling/offset 属性
[Normal] -用来修饰贴图变量,该贴图必须是一个法线贴图
[HDR] -用来修饰贴图变量,该贴图必须是一个high-dynamic range(HDR)贴图
[Gamma]- indicates that a float/vector property is specified as sRGB value in the UI (just like colors are), and possibly needs conversion according to color space used. SeeProperties in Shader Programs.
[PerRendererData]-indicates that a texture property will be coming from per-renderer data in the form of a MaterialPropertyBlock. Material inspector changes the texture slot UI for these properties.
Example
// properties for a water shader
Properties
{
_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) = “” {} // textures
_RefractionTex (“Environment Refraction”, 2D) = “” {}
_Fresnel ("Fresnel (A) ", 2D) = “” {}
_BumpMap ("Bumpmap (RGB) ", 2D) = “” {}
}
ShaderLab:SubShader
Unity中的每一个Shader都由一系列的subshader构成。当unity需要展示一个模型时,它会找到使用的shader并且找到在目标设备上第一个可用的subshader来执行,而不会执行剩余的其他subshader
Syntax
Subshader{[Tags] [CommonState] Passdef [Passdef…]}
Details
subshader 定义了一系列的渲染通道,并且可以设置对所有通道都可用的一些状态以及subshader 层级的标签
因为subshader内定义的每一个pass都会导致该物体被渲染一次,而对物体的一次渲染开销昂贵,所以尽可能少的定义pass,但必须有一个。
在unity判断哪一个subshader可以用的时候,会对该对象的每一个pass都执行一次。
pass有三种类型:regular Pass ,Use pass or Grab Pass
所有在 pass的语句块内的代码都可以放在subshader块内,而subshader块内的内容会在所有的通道中执行
Example
// …
SubShader {
//一个之定义了一个通道的subshader
Pass {
Lighting Off //关闭所有光照效果
SetTexture [_MainTex] {} //用_MainTex这个贴图渲染模型
}
}
// …
ShaderLab:Pass
Syntax
Pass{[Name and Tags] [RenderSetup]}
Name and tags
一个Pass可以定义自己的名字和任意数量的标签
通过 “tagname”=“value” 的形式,告诉渲染引擎要做什么
Render state set-up 设置显卡的渲染状态
Cull 设置多边形剔除模式 ,模型被剔除的部分不参与渲染
Cull Back | Front |Off // 背面/前面/关闭(无剔除) 剔除
ZTest 设置深度缓冲测试模式
ZTest (Less | Greater |LEqual |GEqual |Equal|NotEqual |Always
ZWrite 设置深度缓冲写模式
ZWrite On|Off
Offset 设置 Z 缓冲的深度便宜
Offset OffsetFactor,OffsetUnits
Blend 设置alpha混合,alpha 操作和alpha-to-coverage 模式
Blend sourceBlendMode destBlendMode
Blend sourceBlendMode destBelndMode ,alphaSourceBlendMode alphaDestBlendMode
BlendOp colorOp
BlendOp colorOp ,alphaOp
AlphaToMask On | Off
ColorMask
ColorMask RGB | A | 0 | any combination of R, G, B, A
设置颜色通道的遮罩 。 ColorMask 0 turns off rendering to all color channels.
历史遗留的 固定功能 shader 的指令
有一些指令用来写固定功能管线shader.而这些内容是即将被丢弃的,因为通过写 表面着色器或者 shader programs 能够更加灵活。然而对某些非常简单的固定功能的shader,使用这些指令会非常简单
以下所有指令在非固定功能shader中都是无效的。
Fixed-function Lighting and Material
Lighting On | Off
Material {Material Block}
SeparateSpecular On |Off
Color Color-value
ColorMaterial AmbientAndDiffuse |Emission
All of these control fixed-function per-vertex Lighting: they turn it on, set up Material colors, turn on specular highlights, provide default color (if vertex Lighting is off), and controls how the mesh vertex colors affect Lighting. See documentation on Materials for more details.
Fixed-function Fog
Fog {Fog Block}
Fog Block Content
Mode Off |Global |Linear |Exp |Exp2
Color ColorValue
Density FloatValue
Range FloatValue,FloatValue
默认雾效的设置在 Lighting 窗口中配置
Fixed-function AlphaTest
AlphaTest (Less |Greater |LEqual |GEqual |Equal |NotEqual|Always) CutoffValue
alpha 测试
AlphaTest comparison AlphaValue //Set up the alpha to only render pixels whose alpha value is within a certain range
Fixed-function Texture conbiners
在渲染状态设置之后,使用SetTexturn命令来制定渲染用的贴图和贴图的组合模式
SetTexturen textureProperty {combine options}
Details
Shader passes interact with Unity’s rendering pipeline in several ways; for example, a Pass can indicate that it should only be used for deferred shading using the Tagscommand. Certain passes can also be executed multiple times on the same GameObject; for example, in forward rendering the “ForwardAdd” pass type is executed multiple times based on how many Lights are affecting the GameObject. See documentation on the Render Pipeline for more details.
ShaderLab:Fallback
在所有Subshader的定义结束之后,可以声明一个Fallback。用来告诉显卡,如果没有可以用的subshader,试试看这里的这个shader能不能用。
Syntax
Fallback “name”
Fallback Off
明确说明没有fallback ,而且不会打印警告,即使没有可用的subshader
ShaderLab:Category
Category 是对其下的命令的逻辑分组。例如,如果你的shader有多个subshader,并且每一个subshader都需要关闭雾效和以及一样的blending mode ,就可以使用Category:
Shader “example” {
Category {
Fog { Mode Off }
Blend One One
SubShader { // … }
SubShader { // … }
// …
}
}
Category 代码块,仅仅影响shader的解析,并不影响shader的执行。
原文:https://blog.csdn.net/u013746357/article/details/52798215