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,物体将不会产生阴影。
(3.3)Pass

每个通道(Pass)都能使几何对象被渲染一次。Pass语法如下:

Pass{[Name and Tags][RenderSetup][Texturesetup]}

基本的通道渲染命令包含一个可选的渲染设置命令(RenderSetup)的列表和一个可选的纹理设置命令(TextureSetup)的列表。一个通道能定义它的Name和任意数量的Tags(用于向渲染引擎传递通道的意图的·名称/值的字符串)。

RenderSetup:通道渲染设置命令

通道渲染设置命令可以设置显卡的各种状态,例如能打开alpha混合,能使用雾等。这些命令如下所示:

命令

说明

Material{材质块}

定义一个使用定点光照管线的材质

Lighting On/Off

开启或关闭定点光照

Cull剪裁模式

设置剪裁模式,剪裁模式有BackFrontOff

ZTest深度测试模式

设置深度测试模式,测试模式有LessGreaterLEqual,GEqual,Equal,NotEqual,Always

ZWrite On/Off

开启或关闭深度写模式

Fog

设置雾参数

AlphaTest测试模式<测试模式值>

开启alpha测试,测试模式有LessGreaterLEqual,GEqual,Equal,NotEqual,Always

Blend 混合模式

设置alpha混合模式,混合模式有SourceBlendMode,DestBlendMode

Color<颜色>

设置当顶点光照关闭时所使用的颜色

ColorMask颜色值

设置颜色遮罩,设置颜色遮罩,颜色值可以是RGBA0或任何RGBA的组合,设置为0将关闭所有颜色通道的渲染。

Offset偏移因子

设置深度偏移,这个命令仅接受常数参数

SeparateSpecular 开关状态

开启或关闭顶点光照相关的镜面高光颜色,开关状态的值为OnOff

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:显示声明没有子着色器能被运行,且没有降级,并且不会打印任何警告。
(3.6)Category

分类(Category)是渲染命令的逻辑组。大多数情况下被用于继承渲染状态。例如,着色器可以有多个子着色器,大多数情况下被用于继承渲染状态。例如,着色器可以有多个子着色器,它们都需要关闭雾效果、混合等。下面的代码片段说明了分类的使用:

Shader “example”{        Category{        Fog {Mode Off}//设置雾模式        Blend One one//设置混合模式        SubShader{}        }}





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩不喜欢吃水果怎么办 校长想整老师怎么办 和老师吵架了怎么办 孩子初中转学学籍怎么办 孩子上初中学籍怎么办 18孩子不想上学怎么办 宝宝不爱吃蔬菜怎么办 孩子总丢东西怎么办 孩子经常丢东西怎么办 孩子总是丢东西怎么办 孩子负能量太多怎么办 不要孩子老了怎么办 父母都内向孩子怎么办 孩子不喜欢读课外书怎么办 学习学不进去怎么办 小孩停不下来怎么办 小孩老爱玩不爱学习怎么办 小孩子不喜欢吃菜怎么办 孩子初中不爱学习怎么办 大学不爱学家长怎么办 小孩子不爱读书不听话怎么办 小孩不爱读书写字怎么办 一年级学生不爱学习怎么办 孩子练字怕累怎么办 孩子不愿意学英语怎么办 生了儿子 不喜欢 怎么办 养两个儿子的怎么办 看诗词记不住怎么办 经常读书记不住怎么办 孩子不爱记数字怎么办 考研学不进去怎么办 读了职高后悔怎么办 不喜欢看书的人怎么办 生的儿子不喜欢怎么办 孩子上网不回家怎么办 儿子不想读书了怎么办 中考体育考不好怎么办 小孩突然没礼貌怎么办 小孩读书记忆差怎么办 这几天不爱吃饭怎么办 读书读到不懂的怎么办