zoukankan      html  css  js  c++  java
  • ShaderLab

    ShaderLab

      Shader is the root command of a shader file. Each file must define one (and only one) Shader. It specifies how any objects whose material uses this shader are rendered.

    1、Syntax

      Shader "name{ [Properties] Subshaders [Fallback] } Defines a shader. It will appear in the material inspector listed under name. Shaders optionally can define a list of properties that show up as material settings. After this comes a list of SubShaders, and optionally a fallback.

    2、Properties

      Shaders can have a list of properties. Any properties declared in a shader are shown in the material inspector inside Unity. Typical properties are the object color, textures, or just arbitrary values to be used by the shader.

    3、SubShaders & Fallback

      Each shader is comprised of a list of sub-shaders. You must have at least one. When loading a shader, Unity will go through the list of subshaders, and pick the first one that is supported by the end user's machine. If no subshaders are supported, Unity will try to use fallback shader.

    // colored vertex lighting
    Shader "Simple colored lighting" {
        // a single color property
        Properties {
            _Color ("Main Color", Color) = (1,.5,.5,1)
        }
        // define one subshader
        SubShader {
            Pass {
                Material {
                    Diffuse [_Color]
                }
                Lighting On
            }
        }
    } 
    View Code

    Properties

     Syntax

     Properties { Property [Property ...] }
        Defines the property block. Inside braces multiple properties are defined as follows.

     

      Each property a default value is given after equals sign: 

      

    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) = "" {} // textures
        _RefractionTex ("Environment Refraction", 2D) = "" {}
        _Fresnel ("Fresnel (A) ", 2D) = "" {}
        _BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
    } 
    View Code

      

      Later on in the shader’s fixed function parts, property values can be accessed using property name in square brackets:[name]. For example, you could make blending mode be driven by a material property by declaring two integer properties (say “SrcBlend“ and ”DstBlend”), and later on make Blend Command use them: Blend [_SrcBlend] [_DstBlend].

       In front of any property, optional attributes in square brackets can be specified.

    • [HideInInspector] - does not show the property value in the material inspector.
    • [NoScaleOffset] - material inspector will not show texture tiling/offset fields for texture properties with this attribute.
    • [Normal] - indicates that a texture property expects a normal-map.
    • [HDR] - indicates that a texture property expects a high-dynamic range (HDR) texture.
    • [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. See Properties in Shader Programs.

    Fallback

      After all Subshaders a Fallback can be defined. It basically says "if none of subshaders can run on this hardware, try using the ones from another shader".

      Syntax

      Fallback "name"

        Fallback to shader with a given name.

      Fallback Off
        Explicitly state that there is no fallback and no warning should be printed, even if no subshaders can run on this hardware.
    Shader "example" {
        // properties and subshaders here...
        Fallback "otherexample"
    } 
    View Code

    Subshaders

      Syntax,实际上是Pass的容器,组合多个Pass。

      Subshader { [Tags] [CommonStatePassdef [Passdef ...}

      Defines the subshader as optional tags, common state and a list of pass definitions.

      Each pass definition can be a regular Pass, a Use Pass or a Grab Pass.

      Any statements that are allowed in a Pass definition can also appear in Subshader block. This will make all passes use this "shared" state.  

    // ...
    SubShader {
        Pass {
            Lighting Off
            SetTexture [_MainTex] {}
        }
    }
    // ...
    View Code

    Subshader Tags

      Subshaders use tags to tell how and when they expect to be rendered to the rendering engine.

      Syntax

      Tags { "TagName1" = "Value1" "TagName2" = "Value2}
      Specifies TagName1 to have Value1TagName2 to have Value2. You can have as many tags as you like.

      In addition to built-in tags recognized by Unity, you can use your own tags and query them using Material.GetTag function.   

      You can determine in which order your objects are drawn using the Queue tag.   

    Shader "Transparent Queue Example" {
         SubShader {
            Tags {"Queue" = "Transparent" }
            Pass {
                // rest of the shader body...
            }
        }
    } 
    View Code

      For special uses in-between queues can be used. Internally each queue is represented by integer index; Background is 1000,Geometry is 2000, AlphaTest is 2450, Transparent is 3000 and Overlay is 4000. If a shader uses a queue like this:

  • 相关阅读:
    树状数组基本操作
    P1802 5倍经验日 题解
    函数学习总结
    康托展开
    中国电信CDMA无线上网卡短信收发
    报错:无法获取实体类XXX对应的表名!
    javajvisualvm远程监控云服务器上的Tomcat8.5
    服务器防火墙开放端口
    报错:列"AGENT_ENTITY_NAME"的值太大(实际值: 60,最大值50) oracle VARCHAR2和NVARCHAR2的区别
    linux中查看端口是否被占用lsof i:port
  • 原文地址:https://www.cnblogs.com/tekkaman/p/3859257.html
Copyright © 2011-2022 走看看