相关文档
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 } } } }