Unity Shader 之一 语法基础

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/u013746357/article/details/52798215
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的执行。
    






猜你喜欢

转载自blog.csdn.net/u013746357/article/details/52798215