Shader "name" { [Properties] Subshaders [Fallback] }
(1)Properties:{ Property [Property ...] }
  属性列表,如color、texture、float等。
  name ("display name", Range (min, max)) = number
  name ("display name", Color) = (number,number,number,number)
  name ("display name", 2D) = "name" { options } 定义2D纹理属性
  name ("display name", Rect) = "name" { options } 定义长方形(非2次方)纹理属性
  name ("display name", Cube) = "name" { options }
  name ("display name", Float) = number
  name ("display name", Vector) = (number,number,number,number)
  在Unity中, name通常使用下划线开始的命名方式。
  在着色器中,属性值通过[name]来访问对应的属性。
  texture的大括号中可以设置:TexGen(ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal)、LightmapMode。

Properties {
// properties for water shader
// 水着色器的属性
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
_ReflDistort ("Reflection distort", Range (,1.5)) = 0.5
_RefrDistort ("Refraction distort", Range (,1.5)) = 0.4
_RefrColor ("Refraction color", Color) = (., ., ., ) // color
_ReflectionTex ("Environment Reflection", 2D) = "" {TexGen EyeLinear} // textures
_RefractionTex ("Environment Refraction", 2D) = "" {}
_Fresnel ("Fresnel (A) ", 2D) = "" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}

(2)Subshaders:Subshader { [Tags] [CommonState] Passdef [Passdef ...] }
  至少有一个,当加载一个着色器时,Unity将遍历这个列表,获取第一个能被用户机器支持的着色器。
(2.1)Tags:Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
  渲染排序队列Rendering Order - Queue tag,eg:"Queue" = "Transparent"
  有四种预定义的渲染队列,在预定义队列之间还可以定义更多队列:
  Background:1000,后台,天空盒
  Geometry (default):2000,不透明的物体

  Alpha Test:2450
  Transparent:3000,透明,所有的alphe blend
  Overlay:4000,覆盖,任何需要最后渲染的对象应该放置在此处,如镜头光晕
  忽略投影标签:"IgnoreProjector" = "True"
  如果设置忽略投影标签为"True",那么使用这个着色器的对象将不会被投影机所影响。对半透明的物体来说最有用处,因为没有对他们产生投影的好办法。

  如果设置忽略投影标签为"True",那么使用这个着色器的对象将不会被投影机所影响。对半透明的物体来说最有用处,因为没有对他们产生投影的好办法。

  ForceNoShadowCasting,值为"true"时,表示不接受阴影。
  RenderType标签:Unity可以运行时替换符合特定RenderType的所有Shader。Camera.RenderWithShader或者Camera.SetReplacementShader配合使用。Unity内置的RenderType包括:
  Opaque:绝大部分不透明的物体都使用这个;
  Transparent:绝大部分透明的物体、包括粒子特效都使用这个;
  Background:天空盒都使用这个;
  Overlay:GUI、镜头光晕都使用这个;

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

  DisableBatching tag 禁用批处理
    当使用绘制调用批处理 Draw Call Batching 时,一些e shaders(主要是做对象空间顶点变形的shader)不工作 - 这是因为批处理将所有几何转换为世界空间,因此“对象空间”丢失。
  DisableBatching标签可以用来消除这个问题。 有三个可能的值:
    “True”(始终禁用此着色器的批处理)
    “False”(不禁用批处理;这是默认值)
    “LODFading”(当LOD衰减活动时禁用批处理;主要用于树)。
  ForceNoShadowCasting tag 强制无阴影投射
    如果给出了ForceNoShadowCasting标签并且值为“True”,则使用此subshader渲染的对象将永远不会投射阴影。 当你在透明对象上使用shader替换,并且你不会继承来自另一个subshader的阴影传递时,这是最有用的。
  IgnoreProjector tag 忽略投影机
    如果给定IgnoreProjector标记并且值为“True”,则使用此shader的对象不会受到投影机的影响。 这对半透明对象最有用,因为暂时没有对他们产生投影的比较合适的办法,那么直接忽略掉就行了。。
  CanUseSpriteAtlas tag 可以使用Sprite图集
    如果shader用于sprite,则将CanUseSpriteAtlas标记设置为“False”,并且当它们打包到地图集时不会工作(请参阅Sprite Packer)。
  PreviewType tag 预览类型
    PreviewType指示material inspector预览应如何显示材质。 默认情况下,材质显示为球体,但PreviewType也可以设置为“Plane”(显示为2D)或“Skybox”(将显示为天空盒)。

(2.2)Pass:Pass { [Name and Tags] [RenderSetup] [TextureSetup] }
  一个pass代表一次渲染过程
(2.2.1)Name:一个通道能被赋予一个名字以便UsePass 命令能索引到它,所有通道名字都是大写开头。
(2.2.2)Tags:Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
  LightMode光照模式标签:Always,ForwardBase,ForwardAdd,PrepassBase,PrepassFinal,Vertex,VertexLMRGBM,VertexLM,ShadowCaster,ShadowCollector
  RequireOptions需要选项标签:当一些外部条件得到满足时 这个pass才渲染,这是通过使用RequireOptions标签,它的值是一个空格分割的字符串,目前由Unity3d支持的选项是:SoftVegetation
(2.2.3)Render Setup渲染设置
  Material { Material Block } 定义一个使用顶点光照管线的材质:Diffuse Ambient Specular Shininess Emission(自发光颜色,当不被任何光照所照到时,对象的颜色) 
  Lighting On | Off 开启或关闭顶点光照
  Cull Back | Front | Off 剔除模式
  ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) 深度测试模式
  ZWrite On | Off 深度写模式
  Fog { Fog Block } 雾参数 Fog { Mode Linear Color(1,0,0) Range 10,99 }
  AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue 开启alpha测试
  Blend SourceBlendMode DestBlendMode alpha混合模式
  Color Color value 当顶点光照关闭时所使用的颜色
  ColorMask RGB | A | 0 | any combination of R, G, B, A 颜色写遮罩。设置为0将关闭所有颜色通道的渲染
  Offset OffsetFactor , OffsetUnits 深度偏移
  SeparateSpecular On | Off 开启或关闭顶点光照相关的平行高光颜色,这个命令会添加高光光照到着色器通道的末尾,因此贴图对高光没有影响。只在光照开启时有效。
  ColorMaterial AmbientAndDiffuse | Emission 当计算顶点光照时使用每顶点颜色
(2.2.4)Texture Setup纹理设置 SetTexture texture property { [Combine options] }
  在完成渲染设定后,你能指定一定数量的纹理和当使用 SetTexture 命令时所采用的混合模式,
  纹理设置配置了固定函数多纹理管线,当使用自定义fragment shaders时,将忽略这个设置。
(2.3)UsePass:UsePass "Shader/Name"
  使用来自另一个着色器的命名通道,只有命名了的Pass才能被引用。
(2.4)GrabPass:有两种语法:
  GrabPass { }
  能捕获当前屏幕的内容到一个纹理中。纹理能在后续通道中通过 _GrabTexture 进行访问。
  GrabPass { "TextureName" }

(3)Fallback:如果没有子着色器被支持,Unity将尝试使用Fallback制定的着色器(降级shader)。

(4)Category:用于设置所有SubShader都会继承的渲染状态,效果和直接复制粘贴到每个subshader中一样。

Shader "example" {
Category {
Fog { Mode Off }
Blend One One
SubShader {
// ...
}
SubShader {
// ...
}
// ...
}
}

(5)RenderSetting渲染设置,可以设置fog参数、环境光参数等。
  fog的参数:模式Mode Off | Global | Linear | Exp | Exp2,颜色Color ColorValue,强度Density FloatValue,范围Range FloatValue , FloatValue
  雾化是通过混合已生成的像素的颜色和基于到镜头的距离来确定的一个不变色来完成。雾化不会改变已经混合的像素的透明度值,只是改变RGB值。
  缺省雾设定基于渲染设置。
  开启雾效通常用于优化性能,雾可以让远处的物体淡出而不进行绘制。
  不要低估仔细调整渲染设置后为游戏带来的视觉冲击力。
  渲染设置是针对每个场景的,每个场景都可以有不同的渲染设置。

[NoScaleOffset]_Tex("Texture", 2D) = "black" {}  Inspector不会使用此属性显示纹理属性的纹理平铺/偏移字段。

  

#pragma fragmentoption ARB_precision_hint_fastest

  ARB_precision_hint_fastest 最快的,意思就是会用低精度(一般是指fp16),以提升片段着色器的运行速度,减少时间。

  ARB_precision_hint_nicest 最佳的,意思就是会用高精度(一般是指fp32),可能会降低运行速度,增加时间。

Shader的语法的更多相关文章

  1. 2、shader基本语法、变量类型、shader的三种形式、subshader、fallback、Pass LOD、tags

    新建一个shader,名为MyShader1内容如下: 1._MainTex 为变量名 2.“Base (RGB)”表示在unity编辑面板中显示的名字,可以定义为中文 3.2D 表示变量的类型 4. ...

  2. Unity Shader IDE — Sublime Text2

    使用MonoDevelop写了一段时间的Shader代码,发现效率太低了,所以换用Sublime Text. 安装Sublime Text 1.下载 sublime Text2 官网:http://w ...

  3. 关于Shader的跨平台方案的考虑

      Apple 推出 metal后,除了新的metal framewrok外,也多了一种新的shader语言,最近工作也做了一些metal移植的测试,主要还是现有引擎如何可以快速支持metal的解决方 ...

  4. 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)

    写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...

  5. 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)  ...

  6. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...

  7. 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)

    写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ...

  8. 关于Unity中Shader的基础认识

    Shader也叫着色器,是Unity里面比较难的一个点,网上有很多别人写好的shader,我们可以下载下来用或者修改学习. Shader可以做出很多非常不错的效果,因为它是插在渲染管道里面的程序,一来 ...

  9. Unity3d之Shader开发介绍

    Shader是为渲染管线中的特定处理阶段提供算法的一段代码.shader是伴随着可编程渲染管线出现的,它的出现使得游戏开发者可以对渲染过程加以控制,拥有更大的创作空间,因此Shader的出现可以看作是 ...

随机推荐

  1. 【转】C++11 标准新特性: 右值引用与转移语义

    VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...

  2. Puppet Openstack Mitaka Design Summit小结

    Puppet Openstack Design Summit小结 经过Puppet Openstack社区的不断努力,Puppet Openstack社区目前提供的Official Modules已经 ...

  3. Revit中绘制带坡度管道

    激活管道绘制命令出现绘制管道上下文菜单,可以根据需要设置管道坡度值,是向上坡度还是向下坡度,其中两个命令非常有用,一个是继承高程,一个是忽略坡度以连接.在Revit建模中尝尝碰到一些带有坡度的管道,比 ...

  4. C++ Data Member内存布局

    如果一个类只定义了类名,没定义任何方法和字段,如class A{};那么class A的每个实例占用1个字节的内存,编译器会会在这个其实例中安插一个char,以保证每个A实例在内存中有唯一的地址,如A ...

  5. 奇怪吸引子---Rucklidge

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  6. Ques核心思想——CSS Namespace

    Facebook’s challenges are applicable to any very complex websites with many developers. Or any situa ...

  7. asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件

    public class BasePage:Page protected override void OnPreLoad(EventArgs e){     base.OnPreLoad(e);    ...

  8. Android开发贴士集合

    Activity.startActivities()——对于从app流的中部启动会非常好. TextUtils.isEmpty()——一个普遍适用的简单工具类. Html.fromHtml()——格式 ...

  9. C# WinForm 技巧八:界面开发之“WeifenLuo.WinFormsUI.Docking+OutLookBar” 使用

    概述      最近几天一直在关注WinFrom方面的文章主要还是园子里伍华聪的博客,在看看我们自己写的项目差不忍赌啊,有想着提炼一下项目的公共部分,公共部分有分为 界面,类库两方面,今天主要是把界面 ...

  10. Turn off swi-prolog protocol output of ANSI terminal control sequences

    To save a record of program execution in prolog, we use the special predicates: protocol and noproto ...