shader : 决定材质 跟灯光的作用。
shader 属性定义的通用格式:
Properties { Property [ Property ... ] } (相当于一个类的公共变量)
Properties
{
定义一个Int:
name("display name" , Int) = 1
定义一个Float:
name("display name" , Float) = 1.0
定义一个Range (一个变化范围)
name("display name" , Range( 1 , 5 ) ) = 2
定义一个颜色 (4维表示)
name("display name" , Color) = (1,1,1,1)
定义一个 4维数组
name ("display name" , Vector ) = (1,1,1,1)
定义一个纹理 (Texture)
name ("display name" , 2D ) = "white"{}
定义一个 CubeMap (6个面的纹理 反射 或 天空盒)
name ("display name" , Cube ) = "skybox"{TexGen CubeReflect} //定义一个立方贴图纹理属性
定义一个3d的纹理
name ("display name" , 3D ) = ""{}
}
1:name('display name",type)=值;
name: 变量名字, 以下划线开头_Name;
disply name: 共外界 Unity 菜单栏显示
type(int/Float/Range): 变量类型
= 1/1.0/2: 默认值
2:类型:
Float、Int、Color(num,num,num,num)(0~1)、Vector(4维向量)、Range(start,end)
2D:2D纹理属性;
Rect:矩形纹理属性;
Cube:立方体纹理属性;
3D:3D纹理属性;
name("dispalyname",2D) = "name"{options}
3:options:纹理属性选项
TexGen:纹理生成模式,纹理自动生成纹理坐标的模式;顶点shader将会忽略此选项;(模式下包括ObjectLiner、EyeLinear、SphereMap、Cube Reflect CubeNormal)
LightmapMod:光照贴图模式如果设置这个选项,纹理会被渲染器的光线贴图所影响。
3D纹理(限制):
1.只能用脚本创建
2.opengl3.0 及以上 才支持
Shader能操作的只有以下三部分
一、顶点 着色器:
1. 计算顶点的颜色
2.顶点变换
3.灯光的作用
二 、片段 着色器:
1.纹理采样。(贴纹理)
三。、三大测试:
第一点:SubShader-顶点着色器详细讲解:
1:SubShader{[Tags],[CommonState],Pass{}}
子着色器由标签(Tags),通用状态,通过列表组成,它定义了一个渲染通道列表,并可选为所有通道初始化需要的通用状态;
2:SubShader渲染的时候,将优先渲染一个被每个通道所定义的对象。
3:通道的类型:RegularPass、UsePass、GrabPass。
4:在通道中定义状态同时对整个子着色器可见,那么所有的通道可以共享状态。
SubShader{
Tags{"Queue","Transparent"}
Pass{
Lighting Off // 关闭光照
...
}
}
Tags:
Tags{"标签1","value1""标签2"="value2"}
标签的类型:
Queue tag:队列标签;
RenderType tag:渲染类型标签;
DisableBatching tag:禁用批处理标签;
ForceNoShadowCasting tag:强制不投影标签;
IgnoreProjecttor tag:忽略投影标签;
CanUseSpriteAtlas tag:使用精灵图集标签;
PreviewType tag:预览类型标签;
Pass:
1.subshader包装了一个渲染方案,这些方案由一个个通道(Pass)来执行的,SubShader可以包括很多通道块,每个Pass都能使几何体渲染一次;
2.Pass基本语法
Pass{[Name and Tags][RenderSetup][Texture Setup]}
Pass块的Name引用此Pass,可以在其他着色器的Pass块中引用它,减少重复操作,Name命令必须大写;
RegularPass 通道类型的渲染设置:
1.Lighting光照:开启关闭定点光照 On/Off
2.Material{材质块}:材质,定义一个使用定点光照管线的材质
3.ColorMaterial:颜色集 计算定点光照时,使用顶点颜色
4.SeparateSpecular:开关状态,开启或关闭帝国点光照相关的镜面高光颜色,On/Off
5.Color 设置顶点光照关闭时,所使用的颜色
6.Fog(雾块):设置雾参数
7.AlphaTest:Alpht测试
8.ZTest:深度测试模式
9.ZWrite:深度写模式
10.Blend:混合模式(SourceBlendMode、DestBlendMode、AlphaSourcesBlendMode、AlphaDstBlendMode)
11.ColorMask 颜色遮罩:设置颜色遮罩,颜色值可以有RGB或A或0或R、G、B、A的组合,设置为0关闭所有颜色通道渲染;
12.Offset 偏移因子:设置深度偏移
UsePass 通道类型的渲染设置(特殊通道):
插入所有来自其他着色器的给定名字的通道;
UsePass“Shader/Name", //Name为着色器通道名称;
UsePass”Specular/BASE" //插入Specular中为BASE的通道;
GrabPass 通道类型的渲染设置(特殊通道):
GrabPass{}:一种特殊通道类型,他会捕获物体所在位置的屏幕内容,并写入一个纹理中,这个纹理能被用于后续通道中完成一些高级图像特效,后续通道可以使用_GrabTexture进行访问。
GrabPass{"纹理名称"}捕获屏幕内容到指定纹理中,后续通道可以通过纹理名称来访问。
Fallback:
1.降级,定义的所有子着色器,都不能运行的话,则会尝试降级;
2.Fallback“着色器名称”
3.Fallback Off,没有降级,并且不会打印任何警告。
Category 分类:
分类是渲染命令的逻辑组。例如着色器可以有多个子着色器,他们都要关闭雾效果可以如下:
Shader “xxx”{
Category{
Fog{Mode Off}
SubShader{...}
SubShader{...}
}
}
Shader "TestShader/Vertex"
{
Properties
{
_MainTex("Texture",2D) = "white"()
_TestColor("Texture",Color) = (0.1.0.1)
}
SubShader
{
Pass
{
//Color(0,1,0,1)
Color[_TestColor]
Material
{
//Diffuse(1,1,1,1) // 灯光的漫反射与材质如何作用
Diffuse[_TestColor]
//环境光设置
Ambient[_TestColor]
//高光设置 需要打开高光开关
Specular[_TestColor]
//自发光设置
Emission[_TestColor]
}
//高光开关(只对高光起作用)
SeparateSpecular On
//灯光总开关(对所有光起作用)
Lighting On
}
}
}
调节 顶点的颜色:
_TestColor("Texture",Color) = (0.1.0.1)
1. Color(0.1.0.1)
2. Color[ _TestColor]
shader1.0 灯光计算公式:
Ambient * Lighting Window`s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission
Ambient: 环境光
Diffuse: 满反射光
Specular: 镜面反射
Emission : 自发光
Light Color: 灯光颜色
第二点:片段着色器详细讲解:
贴纹理原理:
提问:大小 跟 显示区域不匹配怎么办?(有以下三种情况)
1.纹理 跟显示区域相等 (纹理就是贴图图片,显示区域是要放置材质球的物体 例如Culb)
显示区域 100*100 纹理大小 100*100
2.纹理 大于显示区域
显示区域 100*100 纹理大小 1024*512
处理有两种方法:
方法一、采用 等比例 映射
UV(坐标系):
方法二、Unity提供的 (贴图菜单里的 Filter Mode选项)
。Point : 就近采样
。Bliinear: 就近 周围 4个像素的平均 (上+中+下+左+右)/5
。Tlilnear: 就近 周围 8个像素的平均 (左上+上+右上+右+右下+下+左下+左+中)/9
3.纹理 小于显示区域
显示区域 100*100 纹理大小
锯齿: 马赛克:
处理也可用 Unity提供的 Filter Mode选项里的解决该问题。