Shader的语法
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的语法的更多相关文章
- 2、shader基本语法、变量类型、shader的三种形式、subshader、fallback、Pass LOD、tags
新建一个shader,名为MyShader1内容如下: 1._MainTex 为变量名 2.“Base (RGB)”表示在unity编辑面板中显示的名字,可以定义为中文 3.2D 表示变量的类型 4. ...
- Unity Shader IDE — Sublime Text2
使用MonoDevelop写了一段时间的Shader代码,发现效率太低了,所以换用Sublime Text. 安装Sublime Text 1.下载 sublime Text2 官网:http://w ...
- 关于Shader的跨平台方案的考虑
Apple 推出 metal后,除了新的metal framewrok外,也多了一种新的shader语言,最近工作也做了一些metal移植的测试,主要还是现有引擎如何可以快速支持metal的解决方 ...
- 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)
写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...
- 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨) ...
- Unity Shader入门精要读书笔记(一)序章
本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...
- 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)
写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ...
- 关于Unity中Shader的基础认识
Shader也叫着色器,是Unity里面比较难的一个点,网上有很多别人写好的shader,我们可以下载下来用或者修改学习. Shader可以做出很多非常不错的效果,因为它是插在渲染管道里面的程序,一来 ...
- Unity3d之Shader开发介绍
Shader是为渲染管线中的特定处理阶段提供算法的一段代码.shader是伴随着可编程渲染管线出现的,它的出现使得游戏开发者可以对渲染过程加以控制,拥有更大的创作空间,因此Shader的出现可以看作是 ...
随机推荐
- iOS开发之静态库(六)—— 时空之争
前面的所有试验中,我们的静态库都支持了所有可能的指令集(i386, x86_64, armv7, armv7s, arm64),最大限 度的匹配了所有可能运行该代码的设备,使代码在当前存在的几乎所有i ...
- 详解Bootstrap进度条组件
在网页中,进度条的效果并不少见,如:平分系统.加载状态等,进度条组件使用了css3的transition和animation属性来完成一些特效,这些特效在IE9及IE9以下版本.Firefox的老版本 ...
- C++Builder RAD Studio XE, UTF-8 String 转换为 char * 字符串的最简单方式, 常用于sqlite3开发
前段时间突然使用sqlite3开发,中间需要用中文,XE的缺省char*直接使用中文,在sqlite *.db3的数据库表格中显示是乱码,用数据库管理器来浏览等管理时非常不便. 于是决定还是使用utf ...
- Android之判断当前指定App是否在前台
直接上代码,不多说 //在进程中去寻找当前APP的信息,判断是否在前台运行 private boolean isAppOnForeground() { ActivityManager activity ...
- 使用Gulp和Browserify创建多个绑定文件
Browserify是一个Javascript的绑定工具,帮助我们理顺module之间的依赖关系.Gulp用来优化workflow.两者的共同点都是使用流,但在使用流方面也有不同之处: Browser ...
- Unity 5.4 测试版本新特性---因吹丝停
原文:http://blogs.unity3d.com/2016/03/15/enhanced-visuals-better-performance-and-more-the-unity-5-4-pu ...
- Weblogic Session复制策略与方式
在Weblogic中,HttpSession Replication的方式是通过在weblogic.xml中的session- descriptor的定义persistent-store-type来实 ...
- 解决chi_sim.traineddata报read_params_file: parameter not found: allow_blob_division
在使用语音库时候 遇到报错:allow_blob_division,例如使用chi_sim.traineddata;在chi_sim.traineddata(注意版本)文件目录下,使用命令行执行: c ...
- Hermes实时检索分析平台
一.序言 随着TDW的发展,公司在大数据离线分析方面已经具备了行业领先的能力.但是,很多应用场景往往要求在数秒内完成对几亿.几十亿甚至几百上千亿的数据分析,从而达到不影响用户体验的目的.如何能够及时有 ...
- runtime MethodSwizzle 实践之 奇怪crash : [UIKeyboardLayoutStar release]: message sent to deallocated instance
情景: 使用MethodSwizzle 实现对数组.字典 等系统方法的安全校验.显然能达到预期效果,但实际发现当 键盘显示的情况下 home app 进入后台,再单击app 图标 切换回前台时 发 ...