固定函数着色器

Fixed function Shader

概述:

固定功能着色器是传统的Shader语法,用于非常简单的效果。固定函数着色器完全用一种称为ShaderLab,在Unity内部,固定功能着色器最后会转换为顶点和片段着色器。

ShaderLab:旧版 Fog

概述:

雾化效果根据与摄像机的距离将所生成像素的颜色向下混合为恒定颜色。雾化不会修改混合后像素的 Alpha 值,而只是修改其 RGB 分量。

语法: Fog {命令}

命令 参数 说明
Mode Mode Off | Global | Linear | Exp | Exp2 定义雾模式。默认值是 Global,可转换为 Off 或 Exp2,具体取决于是否在渲染设置 (Render Settings) 中开启了雾效。
Color Color ColorValue 设置雾效颜色。
Density Density FloatValue 设置指数雾效的强度。
Range Range FloatValue, FloatValue 设置线性雾效的远近范围。

示例:

Shader "Custom/FixedFunctionShader"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _Density("Density",Range(0.0,1.0))=0.5
    }
    SubShader
    {
        Pass
        {    //使用inspector面板参数
            Fog{Mode Exp  Density [_Density]   Range 0.0, 100.0  Color [_Color]}  
            //直接赋值
            Fog{Mode Linear  Density 0.5   Range 0.0, 100.0  Color (0,0,0)}
        }
    }
}

ShaderLab:旧版光照

概述:

材质和光照参数用于控制内置顶点光照。顶点光照是为每个顶点计算的标准 Direct3D/OpenGL 光照模型。Lighting on 可开启光照。光照将受到 Material 代码块、ColorMaterial 命令和 SeparateSpecular 命令的影响。

语法:

命令 参数 说明
Color Color color 将对象设置为纯色。颜色是用圆括号括起的四个 RGBA 值,或者是用方括号括起的颜色属性名称。
Material Material {Material 代码块} Material 代码块用于定义对象的材质属性。
Lighting Lighting On | Off 要使 Material 代码块中定义的设置生效,必须使用 Lighting On 命令启用光照。如果关闭光照,则直接从 Color 命令获取颜色。
SeparateSpecular SeparateSpecular On | Off 此命令将镜面反射光照添加到着色器通道的末尾,因此镜面反射光照不受纹理影响。仅当使用 Lighting On 时才有效。
ColorMaterial ColorMaterial AmbientAndDiffuse | Emission 使用每顶点颜色代替材质中设置的颜色。AmbientAndDiffuse 将替换材质的 Ambient 值和 Diffuse 值;Emission 将替换材质的 Emission 值。

Material 代码块:

  • 漫射颜色 (Diffuse color):漫射颜色分量。这是对象的基色。
  • 环境颜色 (Ambient color):环境颜色分量。这是 Lighting 窗口中设置的环境光产生的对象光照颜色。
  • 镜面反射颜色 (Specular color):对象的镜面高光颜色。
  • 光泽度数字 (Shininess number):高光的清晰度,介于 0 到 1 之间。如果为 0,您会看到一个巨大的高光,看起来很像漫射光照;如果为 1,您会看到一个微小的斑点。
  • 发光颜色 (Emission color):任何光源均未照射到对象时的对象颜色。

照射到对象的光源的完整颜色为:

环境光 * Lighting 窗口中的 Ambient Intensity 设置 + (光源颜色 * 漫射 + 光源颜色 * 镜面反射) + 发光

对于照射对象的所有光源,重复该等式的光源部分(圆括号内)。

示例:

Shader "Custom/Shader" 
{
	Properties 
	{
		_Color ("Main Color", Color) = (1,1,1,0)
		_SpecColor ("Spec Color", Color) = (1,1,1,1)
		_Emission ("Emmisive Color", Color) = (0,0,0,0)
		_Shininess ("Shininess", Range (0.01, 1)) = 0.7
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader 
	{
		Pass 
		{
			Material
			{
				Diffuse [_Color]
				Ambient [_Color]
				Shininess [_Shininess]
				Specular [_SpecColor]
				Emission [_Emission]
			}
			Lighting On
			SeparateSpecular On
			SetTexture [_MainTex] 
			{
				Combine texture * primary DOUBLE, texture * primary
			}
		}
	}
}

ShaderLab:旧版 Alpha 测试

概述:

在计算出最终输出颜色之后,颜色可选择性地将其 Alpha 值与固定值进行比较。如果测试失败,则不会将像素写入显示屏。

语法:

命令 参数
AlphaTest Off 渲染所有像素(默认值)
AlphaTest comparison AlphaValue 设置 Alpha 测试以仅渲染 Alpha 值在特定范围内的像素。

Comparison 是以下词语之一:

Greater 仅渲染 Alpha 大于 AlphaValue 的像素。
GEqual 仅渲染 Alpha 大于或等于 AlphaValue 的像素。
Less 仅渲染 Alpha 值小于 AlphaValue 的像素。
LEqual 仅渲染 Alpha 值小于或等于 AlphaValue 的像素。
Equal 仅渲染 Alpha 值等于 AlphaValue 的像素。
NotEqual 仅渲染 Alpha 值不等于 AlphaValue 的像素。
Always 渲染所有像素。这在功能上等同于 AlphaTest Off
Never 不渲染任何像素。

AlphaValue: 一个介于 0 到 1 之间的浮点数。这也可以是 float 或 range 属性的变量引用,在这种情况下,应使用标准方括号表示法 ([VariableName]) 来编写。

示例:

以下是最简单的示例,为其指定带有 Alpha 通道的纹理。仅当 Alpha 大于 0.5 时,该对象才可见

Shader "Simple Alpha Test" 
{
	Properties 
	{
		_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
	}
	SubShader 
	{
		Pass 
		{
			// 仅渲染 Alpha 大于 50% 的像素
			AlphaTest Greater 0.5
			SetTexture [_MainTex] { combine texture }
		}
	}
}

ShaderLab:旧版纹理组合

概述:

在计算基本顶点光照之后将应用纹理。在 ShaderLab 中使用 SetTexture 命令来完成此操作。

可在固定函数纹理中实现旧式组合器效果。您可以在一个通道中包含多个 SetTexture 命令;所有纹理都按顺序应用,就像绘画程序中的图层一样。SetTexture 命令必须放在 Pass 的末尾。

语法:

命令 简介
SetTexture [TextureName] {Texture Block} TextureName 必须定义为纹理属性。

TextureBlock 中定义如何应用纹理。(最多可以有两条命令:combine 和 constantColor)

combine 命令:

  • combine src1 * src2:将 src1 和 src2 相乘。结果将比任一个输入更暗。
  • combine src1 + src2:将 src1 与 src2 相加。结果将比任一个输入更亮。
  • combine src1 - src2:从 src1 减去 src2。
  • combine src1 lerp (src2) src3:使用 src2 的 Alpha 在 src3 和 src1 之间插值。请注意,插值方向是相反的:当 Alpha 为 1 时使用 src1,而当 Alpha 为 0 时使用 src3。
  • combine src1 * src2 + src3:将 src1 与 src2 的 Alpha 分量相乘,然后加 src3。

所有 src 属性均可为 previous、constant、primary 或 texture 之一。

  • Previous 表示上一个 SetTexture 的结果。
  • Primary 表示光照计算产生的颜色或者是顶点颜色(如果已绑定)。
  • Texture 表示由 SetTexture 中 TextureName 指定的纹理的颜色(请参阅上文)。
  • Constant 表示 ConstantColor 中指定的颜色。

修饰符:

  • 上面指定的公式可以选择性地跟随关键字 Double 或 Quad,作用是让生成的颜色在亮度上乘以 2 或乘以 4。
  • 除了 lerp 参数之外,所有 src 属性都可以选择以 one - 开头,作用是对生成的颜色取非。
  • 所有 src 属性都可以后跟 alpha,作用是仅采用 Alpha 通道。

constantColor 命令: 定义可在 combine 命令中使用的恒定颜色。

示例:

对两个纹理进行 Alpha 混合:

Shader "Examples/2 Alpha Blended Textures" 
{
	Properties 
	{
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
	}
	SubShader 
	{
		Pass 
		{
			// 应用基础纹理
			SetTexture [_MainTex] 
			{
				combine texture
			}
			// 使用 lerp 运算符混入 Alpha 纹理
			SetTexture [_BlendTex] 
			{
				combine texture lerp (texture) previous
			}
		}
	}
}

Alpha 控制的自发光:

Shader "Examples/Self-Illumination 3" 
{
    Properties 
	{
        _IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }

    SubShader 
	{
        Pass 
		{
            // 设置基本顶点光照
            Material 
			{
                Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emission]
            }
            Lighting On

            // 使用纹理 Alpha 混合到白色(= 完全光照)
            SetTexture [_MainTex] 
			{
                constantColor [_IlluminCol]
                combine constant lerp(texture) previous
            }
            // 在纹理中相乘
            SetTexture [_MainTex] 
			{
                combine previous * texture
            }
        }
    }
}

ShaderLab:旧版顶点数据通道映射

概述:

BindChannels 命令用于指定顶点数据映射到图形硬件的方式。默认情况下,Unity 会为您计算绑定,但在某些情况下,您可能希望使用自定义绑定。

例如,您可能会映射要在第一个纹理阶段中使用的主 UV 集,并映射要在第二个纹理阶段中使用的辅助 UV 集;或者告知硬件应将顶点颜色考虑在内。

语法:

命令 简介
BindChannels { Bind "source", target } 指定顶点数据 source 映射到硬件 target。

Source 可以是下列值之一:

  • Vertex:顶点位置
  • Normal:顶点法线
  • Tangent:顶点切线
  • Texcoord:主 UV 坐标
  • Texcoord1:辅助 UV 坐标
  • Color:每顶点颜色

Target 可以是下列值之一:

  • Vertex:顶点位置
  • Normal:顶点法线
  • Tangent:顶点切线
  • Texcoord0、Texcoord1 等等:相应纹理阶段的纹理坐标
  • Texcoord:所有纹理阶段的纹理坐标
  • Color:顶点颜色

示例:

// 将第一个 UV 集映射到第一个纹理阶段
// 并将第二个 UV 集映射到第二个纹理阶段
BindChannels 
{
   Bind "Vertex", vertex
   Bind "texcoord", texcoord0
   Bind "texcoord1", texcoord1
}
// 将第一个 UV 集映射到所有纹理阶段
// 并使用顶点颜色
BindChannels 
{
   Bind "Vertex", vertex
   Bind "texcoord", texcoord
   Bind "Color", color
}

更多请参考

官网
我老婆

posted @ 2021-08-15 15:35  镜子-眼泪  阅读(206)  评论(0)    收藏  举报