zoukankan      html  css  js  c++  java
  • Unity3d Shader

    Unity3d Shader 预览
    Surface Shader
    主要用来实现光照相关处理,可能更简洁。
     Vertex and Fragment Shader
     如果不与光照交互, 则可以用这个shader,更录活
     fixed function shaders
     固定shader主要用于老旧卡
     
     ShaderLab
     不管写哪种shader,最终通过shaderLab实现,其组织结构如下:
     Shader "MyShader" {
        Properties{
            _MyTexture ("My Texture",2D) = "white" {}
            // other properties like colors or vectors go here as well
        }
        SubShader{
            // here goes the 'meat' of your
            // - surface shader or
            // -vertex and fragment shader or
            // -fixed function shader
        }
        SubShader{
            // here goes a simpler version of the subshader above that can run older graphic cards
        }
    }
    开始以下学习前,先简单了解一下shaderlab指南
    ======================================================================
    ShaderLab 语法: Shader
    语法:
      Shader "名字" {[Properties] Subshaders [Fallback]}
      []--可选项目
     
      Properties
      Shader可以有多个属性(properties),每一个属性都显示在Unity的inspector. 如颜色,贴图,或者任意值
     
      Subshaders & Fallback
      每个shader包含多个子shader, 至少包含有一个。当加载shader时, Unity会遍历所有子shader.从上往下选择第一个可以支持的。 如果没有可以支持的, Unity会试着用Fallback shader.
     
     如下就是一个最简单的shader
     // colored vertex lighting
     Shader "Simple colored lighting" {
        // a signle color property
        Properties {
            _Color ("Main Color", Color) = (1,.5,.5,1)
        }
        // define one subshader
        SubShader{
            Pass {
                Material{
                    Diffuse [_Color]
                    }
                    Lighting On
            }
        }
    }
    subshader中包含了一个通道(Pass), 它开启了顶点光,并设置基本材质。

    ShaderLab 语法:Properties
    语法:
        Properties {Property [Property ...] }
    定义 属性块,位于括号中的定义如下:
    Float Range
        name ("diplay name", Range(min, max)) = number
    Color
        name ("diplay name", Color) = (number, number, number, number)
    Texture 2D
        name ("diplay name", 2D) = "name" { options }
    Rectangle
        name ("diplay name", Rect) = "name" { options }
    Cubemap
        name ("display name", Cube) = "name" {options}
    Float
        name ("display name", Float) = number
    Vector
        name ("display name", Vector) = (number, number, number, number)
    例子如下:
    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) = "" {}
    }
    贴图选项
    贴图属性的选项位花括号中,是可选的,可选项目如下:
    1.TexGen 模式,自动贴图坐标生成模式。可以为ObjectLnear, EyeLinear,Shperemap, CubeReflect,CubeNormal之一。这些对应于OpenGL中相应的texgen模式。

    ShaderLab 语法:SubShader
    语法:
        SubShader { [Tags] [CommonState] Passdef [Passdef ...] }

    一个SubShader可以定义一组渲染通道,可选设置共同状态针对所有通道,也可以指定标签
    当Unity确实使用那个SubShader时,它会用该Subshader每个通道一一给对象进行渲染,每一次渲染是一个比较昂贵的操作。尽可能的少用通道。
    例子如下:
    // ...
    SubShader {
        Pass {
            Lighting Off
            SetTexture [_MainTex] {}
        }
    }
    // ...

    ShaderLab 语法:Pass
    语法:
        Pass {[Name and Tasgs] [RenderSetup] [TextureSetup]}
    基本通道命名包含一个可能的渲染设置命令。 以及接着一个可选的一组使用贴图
    Name and Tags
    一个通道可能定义它的名字 和 任意个数标签(key/value队,用于进行通道与引擎间交互)。
    Rander Setup
    通道设置多个图形硬件状态,如打开alpha混合, 使用雾。等等, 命令如下:
    Material
        Material { Material Block}
    定义一个用在顶点光照管线的材质。 见【Material page】
    Lighting
        Lighting On | Off
    打开|关闭顶点光照. 见【Material page】
    Culling
        Cull Back | Front | Off
    设置多边形拣选模式.见【 Cull and Depth page 】
    ZTest
        ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual)
    设置深度检测模式.见【 Cull and Depth page 】
    ZWrite
        ZWrite On | Off
    设置深度写模式.见【 Cull and Depth page 】
    Fog
        Fog {Fog Block}
    设置雾参数。见【Fog page 】
    AlphaTest
        AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual)
    打开Alpha测试。见【Alpha Testing page】
    Blend
        Blend SourceBlendmMode DestBlendMode
    设置混合模式。见【 Blending page】
    Color
        Color Color-value
    在顶点光照打开时,选用的顶点颜色.见【Material page】
    ColorMask
        ColorMask RGB | A | 0 | any combinaion of R,G,B,A
    设置颜色写入mask, 0,表示关闭所有颜色通道写入.见【Material page】
    Offset
        Offset OffsetFacotr, OffsetUnits
    设置Z深度缓冲偏移.见【 Cull and Depth page 】
    SeperateSpecular
        SeperateSpecular On | Off
    打开|关闭顶点光照的分隔高光.见【Material page】
    ColorMaterail
        ColoerMaterial AmbientAndDiffuse | Emission
    使用每一个顶点光,当在计算顶点光照时。见【Material page】
    Texture Setup
    在渲染状态设置后,你可能指定一定数量的贴图和它们的组合模式,通过SetTexture进行应用


    ShaderLab 语法:Color,Material,Lighting
    材质与光照参数用来控件内建顶点光照。顶点光照是标准的D3D/OPENGL光照模式,它为每个顶点逐一计算。Lighting On 打开顶点光照,光照受到Material block,ColorMaterail,SeperateSpecular命令影响。
    像素光照通常用自定义vertex/fragment程序实例,而不是用顶点光照。 下诉命令在像素光照中无效。

  • 相关阅读:
    GridView中CheckBox,RadioButton并存的同时且有相互关系
    SQL重复记录查询
    TextArea的长度限定
    如何获取程序当前目录
    手机归属地查询
    如何更改ComboBox下拉列表的文字颜色
    世界上主要的一些搜索引擎
    WF/WCF/WCS/WPF/MVC/AJAX/RBAC/SOAP/SCRUM
    .Net Framework 3.5 结构图
    如何打开网页链接
  • 原文地址:https://www.cnblogs.com/freebird92/p/4057302.html
Copyright © 2011-2022 走看看