Unity3D着色器Shader入门(一)
来源:互联网 发布:度量矩阵图片 编辑:程序博客网 时间:2024/04/28 22:42
本编文章参考了浅墨大神的博文:http://blog.csdn.net/poem_qianmo/article/details/40955607和猫都能看懂的shader一文:http://www.onevcat.com/2013/07/shader-tutorial-1/
1.Shader 着色器:
Shader是一个着色器文件的根命令,每个着色器文件都必须唯一定义一个Shader,其中定义了材质如何使用这个着色器渲染对象。Shader命令的语法为:
Shader "name"{[Propertities]SubShadesr[Fallback]}
具体语法结构如下:
Shader "Custom/NewShader" {//"这里Custom/NewShader"就是着色器名称,你可以在材质属性查看器里找到它
Properties
{
//着色器拥有一个Propertities列表,这里其实也就是着色器的输入。典型的属性有:颜色,纹理,或是任何被着色器使用的值
}
SubShader
{//着色器还包含的一个子着色器列表,当unity需要显示一个物体时,将会遍历子着色器列表,获取第一个能被用户机器支持的着色器。如果没有子着色器支持,将会使用降级着色器,即Fallback指定的着色器
} FallBack "降级着色器名"}
2.Propertities
着色器可以在属性快中定义一些属性参数,这些参数可以在Inspector面板中显示和调整。Propertities语法格式为:
其中Property type有以下几种:
Float: 定义一个浮点数
Vector: 定义一个四维向量
Range(min,max): 定义浮点数范围属性,在属性查看器中显示为一个滑动条。比如我们看以将这个属性赋值给透明度,这样我们就可以在属性面板中用滑动条调整啦。它的Default value为一个浮点数,比如1.0。
Color: 定义颜色属性,这个属性我们可以在属性查看器中通过颜色拾取器赋值。其Default value为一个四列数组。(number1,number2,number3,number4),其中每一个number取值范围都为0~1。前三个number表示RGB颜色,最后一个number表示透明度。
2D: 定义一个2D纹理属性,其大小一般为2^n * 2^n,比如512*512,其Default value可以为“white”、“black”、“gray”、或“bump”中的一个。
Rect: 定义矩形纹理属性(纹理大小非2^n),其Default value可以为“white”、“black”、“gray”、或“bump”中的一个。
Cube: 立方贴图纹理属性,简单说就是6张有联系的2D贴图的组合,主要用来做反射效果(比如天空盒和动态反射),其Default value可以为“white”、“black”、“gray”、或“bump”中的一个。
后面三种都是纹理类型,他们默认值后面还会跟:{纹理选项},可能的选项如下:
TexGen:纹理生成模式,纹理自动生成纹理坐标时的模式。可以是ObjectLinear、EyeLinear、SphereMap、CubeReflect或CubeNormal,这些模式和OpenGL纹理生成模式相对应。注意如果使用自定义顶点片元着色器,那么纹理生成将被忽略。
LightmapMode:光照贴图模式,如果给出这个选项,纹理会被渲染器的光线贴图所影响,即纹理不能被应用在材质中,而是使用渲染器中的设定。
3.SubShader:
Unity中的每一个着色器都包含一个SubShader的列表,当unity需要显示一个物体时,会遍历所有子着色器,找到第一个能在当前机器上运行的子着色器,找不到的话会使用降级着色器,即FallBack指定的着色器。
Subshader语法如下:
Subshader{[Tags][CommonState]Pass()}
(3.1) CommonState:通用状态(可选),这里是所有通道初始化所需要的通用状态。
(3.2) Tags
子着色器使用Tags来告诉渲染引擎何时和如何渲染对象。Tags使用语法如下:
Tags{"标签1"=“值1” “标签2”=“值2”}
常用的标签及取值如下:
- Queue:队列标签。Queue标签用来决定对象被渲染的顺序。着色器决定对象所归属地渲染队列,任何透明的物体都可以通过这种方法确保在不透明物体渲染之后渲染。ShaderLab中有四种预定义的渲染队列,如下所示:Background:背景,这个渲染队列在所有队列之前被渲染,如渲染天空盒之类。Geometry:几何体。这个队列是默认队列,被用于渲染绝大多数对象。如不透明的几何体使用这个队列。Transparent:透明。这个渲染队列在几何体队列之后被渲染,采用由后到前的次序,任何采用alpha混合的对象(不对深度缓冲产生写操作的着色器)应该在这里渲染(比如玻璃,粒子效果等)。Overlay:覆盖这个渲染队列被用于显示叠加效果。任何需要最后渲染的对象应该放置在此处(如镜头光晕)。
- 自定义队列标签:对于特殊的需求可以使用中间队列来满足。在unity中每一个队列都有一个整数索引值,Background为1000,Geometry为2000,Transparent为3000,Overlay为4000。我们可以用这些队列的索引值加上一个整数来实现中间队列。比如:Tags{"Queue"="Geometry+1"}。这个标签使该对象在所有不透明几何体之后,在所有透明物体之前被渲染。比如,绝大多数时候,透明的水应该在所有不透明对象之后,并在透明物体之前被渲染。
- RenderType:渲染类型标签。用来说明渲染类型:比如“RenderType”=“Opaque”,说明该子着色器应该在渲染不透明的物体时调用,与之对应的是“RenderType”=“Transparent”。
- IgnoreProjector:忽略投影标签,如果设置忽略投影标签为“true”,那么使用这个着色器将不会受到投影器的影响。这对半透明的物体来说最为有用,因为这样他就不会受到投影器的影响而产生阴影。
- ForceNoShadowCasting:强制不产生阴影。如果这个标签为true,物体将不会产生阴影。
每个通道(Pass)都能使几何对象被渲染一次。Pass语法如下:
Pass{[Name and Tags][RenderSetup][Texturesetup]}
基本的通道渲染命令包含一个可选的渲染设置命令(RenderSetup)的列表和一个可选的纹理设置命令(TextureSetup)的列表。一个通道能定义它的Name和任意数量的Tags(用于向渲染引擎传递通道的意图的·名称/值的字符串)。
RenderSetup:通道渲染设置命令
通道渲染设置命令可以设置显卡的各种状态,例如能打开alpha混合,能使用雾等。这些命令如下所示:
命令
说明
Material{材质块}
定义一个使用定点光照管线的材质
Lighting On/Off
开启或关闭定点光照
Cull剪裁模式
设置剪裁模式,剪裁模式有Back,Front,Off
ZTest深度测试模式
设置深度测试模式,测试模式有Less,Greater,LEqual,GEqual,Equal,NotEqual,Always
ZWrite On/Off
开启或关闭深度写模式
Fog
设置雾参数
AlphaTest测试模式<测试模式值>
开启alpha测试,测试模式有Less,Greater,LEqual,GEqual,Equal,NotEqual,Always
Blend 混合模式
设置alpha混合模式,混合模式有SourceBlendMode,DestBlendMode
Color<颜色>
设置当顶点光照关闭时所使用的颜色
ColorMask颜色值
设置颜色遮罩,设置颜色遮罩,颜色值可以是RGB或A或0或任何R、G、B、A的组合,设置为0将关闭所有颜色通道的渲染。
Offset偏移因子
设置深度偏移,这个命令仅接受常数参数
SeparateSpecular 开关状态
开启或关闭顶点光照相关的镜面高光颜色,开关状态的值为On或Off
ColorMaterial 颜色集
当计算顶点光照时使用顶点颜色,颜色集可以是AmbientAndDiffuse,也可以是Emission
TextureSetup:在完成渲染设定(RenderSetup)后,可以指定一定数量的纹理和当使用SetTexture命令时所采用的纹理设置。语法如下:
SetTexture{纹理属性名}{纹理块}
(3.4)其它通道类型
上面讲到的通道即为普通通道(Regular Pass),另外还有两个特殊的通道能用于反复利用普通通道或是实现一些高级特效,如下所示:
通道名称
语法
说明
UsePass
UsePass “Shader/Name”
插入所有来自给定着色器中的给定名字的通道。Shader为着色器的名字,Name为通道的名字
GrabPass
GrabPass{[“纹理名”]}
捕获屏幕到一个纹理,该纹理通常使用在靠后的通道中,“纹理名”是个可选项
UsePass:在着色器中通过UsePass重用其他着色器中已经存在的通道,提高了代码的重用率。为了让UsePass能正常工作,必须给希望使用的通道命名,通道的命名用Name“通道名”命令。例子如下:
UsePass "Specular/BASE"//插入镜面高光着色器中名为"BASE"的通道Name"MyPassName"//通道命名为MyPassName
GrabPass:这是一种特殊的通道,它会捕获物体所在位置的屏幕的内容并写入一个纹理中,这个纹理能被用于后续的通道中完成一些高级图像特效。GrabPass中同样可以使用Name和Tags命令。将GrabPass放入SubShader中有两种方式:
- GrabPass{}: 捕获当前的屏幕内容到一个纹理中。纹理在后续的通道中通过_GrabTexture进行访问。注意,这种形式的捕获通道将在每一个使用该通道的对象渲染过程中执行很耗资源的屏幕捕获操作。
- GrabPass{"纹理名"}: 捕获屏幕内容到一个纹理中,但只会在每帧中处理第一个使用给定纹理名的纹理对象被渲染过程中产生的捕获操作。纹理在后续的通道中可以通过给定的纹理名访问。当在一个场景中拥有多个使用GrabPass的对象时将提高游戏性能。
(3.5)Fallback
降级(Fallback)定义在所有子着色器后。简单来说它表示“当没有任何子着色器能运行在当前硬件上,请尝试使用降级子着色器”,其常用语法如下:
- Fallback "着色器名称":退回到给定名称的子着色器。如:Fallback "Diffuse"
- Fallback Off:显示声明没有子着色器能被运行,且没有降级,并且不会打印任何警告。
分类(Category)是渲染命令的逻辑组。大多数情况下被用于继承渲染状态。例如,着色器可以有多个子着色器,大多数情况下被用于继承渲染状态。例如,着色器可以有多个子着色器,它们都需要关闭雾效果、混合等。下面的代码片段说明了分类的使用:
Shader “example”{ Category{ Fog {Mode Off}//设置雾模式 Blend One one//设置混合模式 SubShader{} }}
- Unity3D着色器Shader入门(一)
- Unity3D着色器Shader编程入门
- Unity3D着色器Shader
- Unity3d 着色器语法(Shader)
- Unity3d 着色器语法(Shader)
- Unity3d 着色器语法(Shader)
- Unity3d 着色器语法(Shader)
- Unity3d 着色器语法(Shader)
- Unity3D Shader入门指南(一)
- Unity3D Shader入门指南(一)
- unity3D Shader入门指南(一)
- Unity3D Shader入门指南(一)
- Unity3D Shader入门优秀博客(一)
- Unity3D Shader入门指南(一)
- Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)
- Unity3d Shader动态表面效果着色器
- Unity3d shader 教程二 最小着色器
- Shader Forge可视化Unity3D Shader编辑器二-基础着色器
- 瑞昱面试经历
- 寻找指定元素
- awk字符串函数(二)
- Jdbc批量插入
- PHP 数据库操作
- Unity3D着色器Shader入门(一)
- Python调用OpenDaylight REST API实验
- hugin编译pano13问题
- 用递归算法计算n!,n!可用下述公式表示
- 网搜
- eclipse预加载
- hdu 1181 变形课
- tcp/ip ---------- tcp(1)
- [leetcode]Recover Binary Search Tree