相关文档
Unity Shader 之 Amplify Shader Editor
Unity Shader学习笔记(3)Unity Shader模板、结构、形式
固定着色器命令
固定着色器命令 光照
材质和光照参数用于控制内置顶点光照。顶点光照是为每个顶点计算的标准Direct3D / OpenGL光照模型。Lighting on。照明受Material 影响块,ColorMaterial和SeparateSpecular命令。
注意:使用顶点程序时,材质/光照命令无效; 在这种情况下,所有计算都在着色器中完整描述。现在建议使用可编程着色器而不是传统的顶点照明。对于这些,您不使用此处描述的任何命令,而是定义自己的顶点和片段程序,您自己进行所有照明,纹理和其他任何操作。
Lighting On | Off
Material { Material Block }
SeparateSpecular On | Off
Color Color-value
ColorMaterial AmbientAndDiffuse | Emission
Color (颜色)
始终以纯红色渲染对象:
Shader "Solid Red" {
SubShader {
Pass { Color (1,0,0,0) }
}
}
传材质球的变量:
Shader "Custom/Solid" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass
{
// 注意:传材质球的变量要用方括号[]
Color [_Color]
}
}
FallBack "Diffuse"
}

Material (材质)
// 最终颜色计算 Ambient * Lighting Window’s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission
Shader "Unlit/Material"
{
Properties {
// 漫反射颜色:这是对象的基色。
_Color ("Main Color", Color) = (1,1,1,0)
// 镜面反射颜色:物体镜面反射高光的颜色。
_SpecColor ("Spec Color", Color) = (1,1,1,1)
// 光泽度数:高光的锐度,介于0和1之间。在0处,你会得到一个巨大的亮点,看起来很像漫反射光,1点你会得到一个微小的斑点。
_Shininess ("Shininess", Range (0.01, 1)) = 0.7
// 自发光颜色:物体未被任何光线击中时的颜色。
_Emission ("Emmisive Color", Color) = (0,0,0,0)
}
SubShader {
Pass {
Material {
// 漫反射颜色:这是对象的基色。
Diffuse [_Color]
// 环境颜色:这是对象在照明窗口中设置的环境光照射时所具有的颜色。
Ambient [_Color]
// 镜面反射颜色:物体镜面反射高光的颜色。
Specular [_SpecColor]
// 光泽度数:高光的锐度,介于0和1之间。在0处,你会得到一个巨大的亮点,看起来很像漫反射光,1点你会得到一个微小的斑点。
Shininess [_Shininess]
// 自发光颜色:物体未被任何光线击中时的颜色。
Emission [_Emission]
}
// 光照开关
Lighting On
// 高光开关
SeparateSpecular On
}
}
}


Lighting On (光照开关)
Lighting Off

SeparateSpecular On (高光开关)
此命令使镜面光照添加到着色器光标的末尾,因此镜面光照不受纹理影响。仅在使用Lighting On时有效。
SeparateSpecular Off

ColorMaterial (使用顶点颜色替代 “漫反射、环境颜色”, “自发光颜色”)
// 用顶点颜色设置 Material的Diffuse和Ambient ColorMaterial AmbientAndDiffuse // 用顶点颜色设置 Emission ColorMaterial Emission
Shader "Unlit/Material"
{
Properties {
// 漫反射颜色:这是对象的基色。
_Color ("Main Color", Color) = (1,1,1,0)
// 镜面反射颜色:物体镜面反射高光的颜色。
_SpecColor ("Spec Color", Color) = (1,1,1,1)
// 光泽度数:高光的锐度,介于0和1之间。在0处,你会得到一个巨大的亮点,看起来很像漫反射光,1点你会得到一个微小的斑点。
_Shininess ("Shininess", Range (0.01, 1)) = 0.7
// 自发光颜色:物体未被任何光线击中时的颜色。
_Emission ("Emmisive Color", Color) = (0,0,0,0)
}
SubShader {
Pass {
Material {
// 漫反射颜色:这是对象的基色。
//Diffuse [_Color]
// 环境颜色:这是对象在照明窗口中设置的环境光照射时所具有的颜色。
//Ambient [_Color]
// 镜面反射颜色:物体镜面反射高光的颜色。
Specular [_SpecColor]
// 光泽度数:高光的锐度,介于0和1之间。在0处,你会得到一个巨大的亮点,看起来很像漫反射光,1点你会得到一个微小的斑点。
Shininess [_Shininess]
// 自发光颜色:物体未被任何光线击中时的颜色。
Emission [_Emission]
}
// 用顶点颜色设置 Material的Diffuse和Ambient
// 设置该选项后,Material里的Diffuse和Ambient将无效
ColorMaterial AmbientAndDiffuse
// 用顶点颜色设置 Emission
// 设置该选项后,Material里的Emission将无效
ColorMaterial Emission
// 光照开关
Lighting On
// 高光开关
SeparateSpecular On
}
}
}
固定着色器命令 纹理
-
使用片段程序时,SetTexture命令无效; 就像在那种情况下像素操作在着色器中完整描述。建议最近使用可编程着色器而不是SetTexture命令。
-
SetTexture命令必须放在Pass的末尾。
-
您可以在一个传递中包含多个SetTexture命令 - 所有纹理都按顺序应用,就像绘画程序中的图层一样。
combine
| 命令 | 介绍 |
|---|---|
| combine src1 * src2 | 结果将比任一输入更暗。 |
| combine src1 + src2 | 结果将比任一输入更亮。 |
| combine src1 - src2 | |
| combine src1 lerp(src2)src3 | lerp(src3, src1, src2.a) |
| combine src1 * src2 + src3 | src1.a * src2.a + src3 |
src的取值
| 值 | 介绍 |
|---|---|
| Previous | 前一个SetTexture的结果 |
| Primary | 照明计算的颜色或绑定时的顶点颜色 |
| Texture | SetTexture中TextureName指定的纹理的颜色 |
| Constant | ConstantColor指定的颜色 |
修饰符
-
Double 或 Quad: 上面指定的公式可以选择性地后跟关键字 Double 或 Quad ,以使得到的颜色2x或4x变亮。
-
One - XXX: 除参数外,所有src属性都lerp可以选择以(One - XXX)以使结果颜色无效。
-
constantColor : 常量是在指定的颜色。
SetTexture [_MainTex] {
combine texture Double
}
SetTexture [_MainTex] {
combine one -texture
}
SetTexture [_MainTex] {
// 指定常量颜色
constantColor (0, 0, 1, 1)
// 混合
combine constant lerp(texture) previous
}
SetTexture [_MainTex] {
// 指定常量颜色, 使用属性里的变量
constantColor [_ColorShape]
// 混合
combine constant lerp(texture) previous
}
放置一张存纹理没有光照
Shader "Unlit/BaseTexture"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
SetTexture [_MainTex]
{
combine texture
}
}
}
}

Alpha混合两个纹理
Shader "Unlit/2 Alpha Blended Textures"
{
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
}
SubShader {
Pass {
// 绘制基础纹理
SetTexture [_MainTex] {
combine texture
}
// 混合:
// lerp(previous, texture, texture.a)
// lerp(_MainTex.rgb, _BlendTex.rgb, _BlendTex.a)
// _BlendTex.a = 0 显示 _MainTex
// _BlendTex.a = 1 显示 _BlendTex
SetTexture [_BlendTex] {
combine texture lerp (texture) previous
}
}
}
}

Alpha混合两个颜色
Shader "Unlit/Self-Illumination"
{
Properties
{
// 设置基础颜色
_Color ("Color", Color) = (0,1,0,1)
// 设置形状颜色
_ColorShape ("Color Shape", Color) = (0,0,1,1)
// 形状图片
_MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
}
SubShader {
Pass {
// 设置基础颜色
Color [_Color]
SetTexture [_MainTex] {
// 设置形状颜色
// constantColor (0, 0, 1, 1);
constantColor [_ColorShape]
// 混合
combine constant lerp(texture) previous
}
}
}
}

透明图片
Shader "Unlit/BaseTexture"
{
Properties
{
// 漫反射颜色:这是对象的基色。
_Color ("Main Color", Color) = (1,1,1,0)
// 镜面反射颜色:物体镜面反射高光的颜色。
_SpecColor ("Spec Color", Color) = (1,1,1,1)
// 光泽度数:高光的锐度,介于0和1之间。在0处,你会得到一个巨大的亮点,看起来很像漫反射光,1点你会得到一个微小的斑点。
_Shininess ("Shininess", Range (0.01, 1)) = 0.7
// 自发光颜色:物体未被任何光线击中时的颜色。
_Emission ("Emmisive Color", Color) = (0,0,0,0)
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags
{
"Queue" = "TransparentCutout"
"RenderType" = "AlphaTest"
}
// 透明抠图必须加这个 或者换成 Blend SrcAlpha OneMinusSrcAlpha
AlphaToMask On
// 双面显示
Cull Off
Pass
{
Material {
// 漫反射颜色:这是对象的基色。
Diffuse [_Color]
// 环境颜色:这是对象在照明窗口中设置的环境光照射时所具有的颜色。
Ambient [_Color]
// 镜面反射颜色:物体镜面反射高光的颜色。
Specular [_SpecColor]
// 光泽度数:高光的锐度,介于0和1之间。在0处,你会得到一个巨大的亮点,看起来很像漫反射光,1点你会得到一个微小的斑点。
Shininess [_Shininess]
// 自发光颜色:物体未被任何光线击中时的颜色。
Emission [_Emission]
}
// 光照开关
Lighting On
// 高光开关
SeparateSpecular On
SetTexture [_MainTex]
{
combine Texture * Primary
}
}
}
}

Fog 雾
Shader "Unlit/Fog"
{
Properties
{
// 漫反射颜色:这是对象的基色。
_Color ("Main Color", Color) = (1,1,1,0)
// 镜面反射颜色:物体镜面反射高光的颜色。
_SpecColor ("Spec Color", Color) = (1,1,1,1)
// 光泽度数:高光的锐度,介于0和1之间。在0处,你会得到一个巨大的亮点,看起来很像漫反射光,1点你会得到一个微小的斑点。
_Shininess ("Shininess", Range (0.01, 1)) = 0.7
// 自发光颜色:物体未被任何光线击中时的颜色。
_Emission ("Emmisive Color", Color) = (0,0,0,0)
_MainTex ("Texture", 2D) = "white" {}
_FogColor ("Fog Color", Color) = (1,1,1,0)
_FogDensity ("Fog Density", Float) = 0.2
_FogRangeMin ("Fog Range Min", Float) = 1
_FogRangeMin ("Fog Range Min", Float) = 1
_FogRangeMax ("Fog Range Max", Float) = 100
}
SubShader
{
Tags
{
"Queue" = "TransparentCutout"
"RenderType" = "AlphaTest"
}
// 透明抠图必须加这个
AlphaToMask On
//Blend SrcAlpha OneMinusSrcAlpha
// 双面显示
Cull Off
// 雾
Fog
{
// 模式
// Mode Off | Global | Linear | Exp | Exp2
Mode Linear
// 颜色
Color [_FogColor]
// 密度
Density [_FogDensity]
// 范围
Range [_FogRangeMin], [_FogRangeMax]
}
Pass
{
Material {
// 漫反射颜色:这是对象的基色。
Diffuse [_Color]
// 环境颜色:这是对象在照明窗口中设置的环境光照射时所具有的颜色。
Ambient [_Color]
// 镜面反射颜色:物体镜面反射高光的颜色。
Specular [_SpecColor]
// 光泽度数:高光的锐度,介于0和1之间。在0处,你会得到一个巨大的亮点,看起来很像漫反射光,1点你会得到一个微小的斑点。
Shininess [_Shininess]
// 自发光颜色:物体未被任何光线击中时的颜色。
Emission [_Emission]
}
// 光照开关
Lighting On
// 高光开关
SeparateSpecular On
SetTexture [_MainTex]
{
combine Texture * Primary
}
}
}
}

AlphaTest 控制Alpha在哪个范围的值渲染
// 渲染所有像素
AlphaTest Off
// 渲染Apha大于0.5的像素
AlphaTest Greater 0.5
| 值 | 功能 |
|---|---|
| Greater | 仅渲染alpha大于AlphaValue的像素。 |
| GEqual | 仅渲染alpha大于或等于AlphaValue的像素。 |
| Less | 仅渲染alpha值小于AlphaValue的像素。 |
| LEqual | 仅渲染Alpha值小于或等于AlphaValue的像素。 |
| Equal | 仅渲染alpha值等于AlphaValue的像素。 |
| NotEqual | 仅渲染Alpha值与AlphaValue不同的像素。 |
| Always | 渲染所有像素。这在功能上等同于AlphaTest Off。 |
| Never | 不要渲染任何像素。 |
Shader "Unlit/AlphaTest"
{
Properties {
_Color ("Main Color", Color) = (.5, .5, .5, .5)
_MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
_Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
}
SubShader
{
Material {
Diffuse [_Color]
Ambient [_Color]
}
//Lighting On
Cull Off
Pass {
AlphaTest Greater [_Cutoff]
SetTexture [_MainTex] {
combine texture * primary, texture
}
}
}
}
