• Unity3D的Shader基本结构—子着色器SubShader


    一、说明

    上一篇文章说明Shader基本结构,但是没有详细说明子着色器SubShader点击打开链接 ,这篇详细说明子着色器SubShader

    二、子着色器SubShader

    写法:
    写在SubShader的第一句
    Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
    比如
    Tags { "RenderType"="Opaque" }
     
    一、标签(Tags)

    1.”Queue”标签。定义渲染顺序。预制的值为 
    (1)”Background”。值为1000。比如用于天空盒。 
    (2)”Geometry”。值为2000。大部分物体在这个队列。不透明的物体也在这里。这个队列内部的物体的渲染顺序会有进一步的优化(应该是从近到远,early-z test可以剔除不需经过FS处理的片元)。其他队列的物体都是按空间位置的从远到近进行渲染。 
    (3)”AlphaTest”。值为2450。已进行AlphaTest的物体在这个队列。 
    (4)”Transparent”。值为3000。透明物体。 
    (5)”Overlay”。值为4000。比如镜头光晕。 
    (6)用户可以定义任意值,比如”Queue”=”Geometry+10” 
    2. “RenderType”标签。Unity可以运行时替换符合特定RenderType的所有Shader。Camera.RenderWithShader或者Camera.SetReplacementShader配合使用。Unity内置的RenderType包括: 
    (1)”Opaque”:绝大部分不透明的物体都使用这个; 
    (2)”Transparent”:绝大部分透明的物体、包括粒子特效都使用这个; 
    (3)”Background”:天空盒都使用这个; 
    (4)”Overlay”:GUI、镜头光晕都使用这个; 
    (5)还有其他可参考Rendering with Replaced Shaders;用户也可以定义任意自己的RenderType字符串。 
    3.”ForceNoShadowCasting”,值为”true”时,表示不接受阴影。 
    4.”IgnoreProjector”,值为”true”时,表示不接受Projector组件的投影。 
    Pass的Tag

    最重要Tag是 “LightMode”,指定Pass和Unity的哪一种渲染路径(“Rendering Path”)搭配使用。除最重要的ForwardBase、ForwardAdd外,这里需额外提醒的Tag取值可包括: 
    1.Always,永远都渲染,但不处理光照。 
    2.ShadowCaster,用于渲染产生阴影的物体。 
    3.ShadowCollector,用于收集物体阴影到屏幕坐标Buff里。 
    另外关于Shader中的数据类型 有三种数据类型 float、half、fixed。 
    这3种基本数值类型可以再组成vector和matrix,比如half3是由3个half组成、float4x4是由16个float组成。 
    (1) float:32位高精度浮点数。 
    (2)half:16位中精度浮点数。范围是[-6万, +6万],能精确到十进制的小数点后3.3位。 
    (3)fixed:11位低精度浮点数。范围是[-2, 2],精度是1/256。 
    数据类型的精度够用就好。例如,颜色和单位向量,使用fixed;其他情况,尽量使用half(即范围在[-6万, +6万]内、精确到小数点后3.3位);否则才使用float。 
    (4)saturate 是指 饱和处理,大于1就变成1,小于0就变成0

    二、LOD级别
    假如设定LOD级别(默认时是200),我们可以在质量控制里面设置某个质量级别能支持的最大LOD级别。如果设定支持的lod级别比shader需要的级别低,那该shader就不可用。
    参考网上的资料:
    VertexLit及其系列 = 100
    Decal, Reflective VertexLit = 150
    Diffuse = 200
    Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
    Bumped, Specular = 300
    Bumped Specular = 400
    Parallax = 500
    Parallax Specular = 600

    2.Material { Material Block }
    这个模块控制了顶点光照的信息,包括漫反射、高光、环境光等
    Diffuse: Color
    默认颜色组件,基本颜色
    Ambient: Color
    环境颜色组件,物体在被RenderSettings里面设置的环境光照射时的颜色
    Specular: Color
    高光反射颜色
    Shininess: Number
    高光的锐利度,在0到1之间,0时高光巨大,1时高光尖锐。
    Emission: Color
    自发光,当物体没有被任何光线照射时的颜色。

    最终颜色:
    Ambient * RenderSettings ambient setting +
      (Light Color * Diffuse + Light Color * Specular) + Emission

    3.Lighting On | Off
    控制顶点光照的开关

    4.Cull Back | Front | Off
    控制剔除的面

    5.ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)
    深度测试模式,小于、大于、小于等于、大于等于、等于、不等于、一直时,才显示。

    6.ZWrite On | Off
    深度写入的开关

    7.Fog { Fog Block }
    这个模块可以给物体单独设置雾的效果。
    示例:
    Fog
    {
    Mode Exp2//Off | Global | Linear | Exp | Exp2
    Color [_Color]
    Density 0.1
    Range 0,300
    }

    8.AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue
    透明度测试,小于、大于、小于等于、大于等于、等于、不等于某值时显示

    9.Blend SourceBlendMode DestBlendMode
    设置混合模式。
    ? One The value of one - use this to let either the source or the destination color come through fully. 
    ? Zero The value zero - use this to remove either the source or the destination values. 
    ? SrcColor The value of this stage is multiplied by the source color value. 
    ? SrcAlpha The value of this stage is multiplied by the source alpha value. 
    ? DstColor The value of this stage is multiplied by frame buffer source color value. 
    ? DstAlpha The value of this stage is multiplied by frame buffer source alpha value. 
    ? OneMinusSrcColor The value of this stage is multiplied by (1 - source color). 
    ? OneMinusSrcAlpha The value of this stage is multiplied by (1 - source alpha). 
    ? OneMinusDstColor The value of this stage is multiplied by (1 - destination color). 
    ? OneMinusDstAlpha The value of this stage is multiplied by (1 - destination alpha). 

    常用的混合模式:
    Blend SrcAlpha OneMinusSrcAlpha     //透明混合
    Blend One One                       // 叠加
    Blend OneMinusDstColor One          // 软叠加
    Blend DstColor Zero                 // 相乘
    Blend DstColor SrcColor             // 2x 相乘

    10.Color Color value
    当Light off时设置颜色

    11.ColorMask RGB | A | 0 | any combination of R, G, B, A
    过滤颜色,如果参数是RGB的一种或几种时,将过滤参数的颜色,如果是0,将过滤所以颜色

    12.Offset OffsetFactor , OffsetUnits
    设置Z缓存深度偏移

    13.SeparateSpecular On | Off
    控制顶点光照的高光开关,如果开了,那么在物体最终颜色基础上再加上高光颜色

    14.ColorMaterial AmbientAndDiffuse | Emission
    使用材质颜色代替环境光、漫反射或者自发光
     
    三、在Pass中一般可以写以下的代码
    Color Color 设定对象的纯颜色,可以是括号中的四个值,也可以是被方框包围的颜色属性名称
    Material{Material Block} 材质被用于定义对象的材质属性,关于材质块的内容可以看下面的介绍
    Lighting On/Off 定义上述材质块的定义是否有效,On时材质块效果有效,Off时颜色通过Color命令直接给出
    SeparateSpecular On/Off 开启独立镜面反射,这个命令会添加高光光照到着色器通道的末尾,因此贴图对高光没有影响。只在光照开启时有效。
    ColorMaterial AmbientAndDiffuse | Emission
    使用每顶点的颜色替代材质中的颜色集。AmbientAndDiffuse 替代材质的阴影光和漫反射值;Emission 替代 材质中的光发射值。
    Pash中材质块Material{}代码写法
    上面已经说了,在Pass中可以书写材质块代码用于定义对象的材质属性,如下的代码可以写在材质块中:
    Diffuse Color(R,G,B,A);对象基本颜色,漫反射
    Ambient Color(R,G,B,A);环境光,当对象被RenderSettings.中设定的环境色所照射时对象所表现的颜色。
    Specular Color(R,G,B,A);对象反射高光的颜色
    Emission Color 对象自发光
    Shininess Number 取值在0-1之间表示加亮时的光泽度
    对象完整光照的最终颜色是:
    FinalColor=Ambient * RenderSettings ambientsetting + (Light Color * Diffuse + Light Color *Specular) + Emission
    即:
    最终颜色=环境光反射颜色* 渲染设置环境设置 (灯光颜色漫反射颜色+灯光颜色*镜面反射颜色)+自发光

    点击打开链接

  • 相关阅读:
    Mysql转换成SqlServer数据库,以及SqlServer转换成Mysql数据库
    MySQL分页存储过程
    zabbix监控指定端口
    zabbix_server.conf 详解
    zabbix监控常见系统报错
    Zabbix3.2下Template App Zabbix Server+Template OS Linux Item
    Zabbix邮件报警配置
    分布式监控系统Zabbix-3.0.3-完整安装记录
    Nginx高级应用之Location Url
    st
  • 原文地址:https://www.cnblogs.com/aibox222/p/9684909.html
Copyright © 2020-2023  润新知