First:
//一个Shader由Properties,SubShader,FallBack组成
Shader"CustomLearn/First"{
//属性:用来指定代码有那些输入
Properties{
//属性的语法:Name("DisplayName",type)=defaultValue(options)
//Name是属性的名字,简单的来说相当于一个变量名,在之后整个Shader代码中将使用
//这个名字获取该属性里面的内容
//DisplayName:将显示在Unity引擎材质编辑器中做为shader的使用者可读取的内容,即材质中显示的内容
//type:属性的类型,主要由以下几种类型:
//1.Color--颜色,RGBA(红,绿,蓝,透明度)由四个量来定义,每个量的值在0-1之间
//2.2D--是一个2的幂次方大小的贴图,这张贴图将在采样后被转化为对应基于模型的UV的每个像素的颜色,最终被显示出来,带有options(可选项)
//3.Rect--是一个非2的幂次方的贴图,
//4.Cube--即Cubemaptexture(立方体纹理),简单的来说就是6张有联系的2D贴图组合,主要用来做反射效果
//2-4对于贴图来说,其值可以用一个代表tint颜色字符串来表示,其值可以为空,options只对贴图有关,里面至少写一个空的{}
//如果需要打开特定选项,可以把其写在{}里面,如果同时打开多个选项,可以用空格分开
//选项有以下几种:ObjectLinear,SphereMap,CubeReflect,CubeNormal中一个或者是White,Black,Gray,Bump(凹凸)中的一个;
//5.Range--一个介于最大值和最小值之间的浮点数,其值可以在材质编辑器中滑动调节,比如Shader中某些特定的参数,透明度其值为0-1,就可以用该类型表示;
//6.Float--一个浮点数
//7.Vector--一个四维数,写成(x,y,z,w);
//defaultValue:默认值,一个符合格式的值来设置为默认值;
_Color ("MainColor",Color) = (1,0.5,0.5,1)
}
//SubShader是子着色器,可以有一个,也可以有多个,在实际运行中,哪个子着色器被调用,是由运行平台来决定的
//子着色器是代码的主体,每一个子着色器包含一个或者多个pass
//每一个pass都会渲染一次对象,在计算着色时,平台会选择最优先使用的那个着色器,然后以此运行里面的pass,会得到一个输出结果,最后才会渲染出来
SubShader{
//pass通道控制被渲染的对象的几何体,除了表面着色器以外,其他两种(固定管线着色器和顶点片段着色器)着色器的subshader下面一定要有pass通道,其语法格式如下
//pass{[NameandTags][RandererSetup][TextureSetup]}
//基本通道包含一个可选的渲染设置命令列表和可选的被使用的文理列表
//NameandTags:可以定义pass的名字和做任意数量的标签,为pass命名后,可以在别的着色器中使用该名字来调用,标签可以用来向渲染器说明pass的意图
//RendererSetUp(渲染设置):只用在固定功能管线着色器中,可以设置图形硬件的各种状态,可用的设置命令如下:
//1.Material{}:材质,定义一个使用定点光照管线的材质
//2.Lighting:光照,其值取为On或Off;
//3.Cull:剪裁,设置剪裁模式,有Back,Front,Off
//4.ZTest:深度测试,模式有LessGreaterLEqualGEqualEqualNotEqualAlways
//5.Fog{}:雾效,设置雾效的参数
//6.AlphaTest:油墨Alpha测试,模式有LessGreaterEqualNotEqualAlways
//7.Blend:Alpha混合
//8.Color:设置顶点光照关闭时使用的颜色
//9.ColorMask:颜色遮罩,当值为零时,相当于关闭所有颜色通道的渲染,取值为RGB\A\0或者RGBA任意组合
//10.Offset:深度偏移
//11.SeparateSpecular:高光颜色,取值为On或者Off
//12.ColorMaterial:颜色集,当计算顶点光照时,使用每个顶点的颜色
//TextureSetup(纹理)的命令有以下三种
//1.combine:将两种颜色混合可以是previous(上一次texture的颜色),constant(常量颜色),primary(顶点颜色),texture(纹理颜色)
//2.constantColor:常量颜色
//3.matrix:设置矩阵对纹理坐标进行变换
pass{
Material{
Diffuse[_Color]
}
Lightingon
}
}
//以上所有的子着色器都不能运行的话,执行该回调
FallBack"Diffuse"
}
second:
Shader"CustomLearn/Second"{
properties{
_Color("MainColor",Color) = (1,1,1,1)
_SpecColor("SpecColor",Color) = (1,1,1,1)
_Emission("Emission",Color) = (0,0,0,0)
_Shininess("Shininess",Range(0.01,1)) =0.7
_MainTex("MainTexture",2D) ="White"{}
}
SubShader{
//tag值暗示了要输出的是什么,如果输出的都是非透明物体,写在Qpaque中,如果想渲染透明或者半透明的物体,写在Transparent里面,其他有用的标签
//“IqnireProject”=true(不受投影影响)
//"ForceNoShadowCasting"="True"(不产生阴影)
//"Queue=XXX"(渲染的顺序队列)
//如果使用Unity做一些透明或者不透明的效果时,很可能会遇到不透明的物体无法在透明物体后边显示出来,这种情况有可能是由shader渲染顺序造成的,Queue的值会有以下几种:
//1.BackGround--最早被调用的渲染,用来渲染天空盒或者背景
//2.Geometry--这个是默认值,用来渲染不透明的物体
//3.Transparent--从后往前的顺序渲染透明物体
//4.Overlay--用来渲染叠加效果,是渲染的最后阶段
//5.以上的值都对应了一个整数
//BackGround--1000
//Geometry--2000
//Transparent--3000
//Overlay--4000
//"Queue"="Transparent"+100表示在Transparent之后100的值的Queue上调用,这样的话就可以通过调整Queue的值,来确保某些物体一定在另一个物体之前或之后渲染
Tags{"Queue"="Transparent"}
//透明度的混合
BlendsrcAlphaOneMinusSrcAlpha
//SubShader包装了一个渲染方案,而方案的执行是由pass来完成的,故可以包含多个pass,而每个pass包含了渲染一个几何体的具体代码
Pass{
Material{
//漫反射颜色
Diffuse[_Color]
//环境光颜色
Ambient[_Color]
//加亮时光泽度0-1之间,如果为0效果为漫反射的颜色,1的时候会得到一个细微的亮斑
Shininess[_Shininess]
//物体反射高光的颜色
Specular[_SpecColor]
//自发光的颜色
Emission[_Emission]
}
//开启灯光
LightingOn
//开启顶点光照的平行高光的颜色
SeparateSpecularOn
//设置纹理
SetTexture[_MainTex]{
//纹理的颜色
ConstantColor[_Color]
//混合效果
Combinetexture* primary DOUBLE,texture*Constant
}
}
}
FallBack"Diffuse"
}
网友评论