版本:Unity 6 (6000.0)
语言:中文
ShaderLab:旧版 alpha 测试
ShaderLab:旧版顶点数据通道映射

ShaderLab:旧版纹理合并

注意:本文档中的 ShaderLabUnity 定义着色器对象结构的语言。 更多信息
请参见 词汇表
功能现已过时,仅出于向后兼容的目的而记录。如果您的 着色器在 GPU 上运行的程序。 更多信息
请参见 词汇表
源文件中包含 HLSL 代码,则 Unity 会完全忽略这些命令。如果您的着色器源文件中不包含 HLSL 代码,则 Unity 会在导入时将这些命令编译为常规着色器程序。

渲染管道兼容性

功能名称 内置 渲染管道将场景内容放置到屏幕上显示的一系列操作。您可以选择预先构建的渲染管道或自行编写。 更多信息
请参见 词汇表
通用渲染管道 (URP) 高清渲染管道 (HDRP) 自定义 SRP
旧版纹理合并

概览

计算完基本的顶点光照后,就开始应用纹理。在 ShaderLab 中,使用 SetTexture 命令来完成此操作。

固定功能纹理定位是执行旧式合并器的效果之处。您可以在 Pass 内使用多个 SetTexture 命令 - 所有纹理会按顺序应用,就像绘画程序中的图层一样。SetTexture 命令必须放在 Pass 的末尾。

语法

SetTexture [TextureName] {Texture Block}

分配纹理。TextureName 必须定义为纹理属性。如何在纹理块内应用纹理取决于 TextureBlock

纹理块控制纹理的应用方式。纹理块最多可以包含两个命令:combineconstantColor

纹理块 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 属性都可以是 previousconstantprimarytexture 中的任意一个。

  • Previous 是前一个 SetTexture 的结果。
  • Primary光照计算 中的颜色,或其是 绑定的 时的顶点颜色。
  • Texture 是 SetTexture(请参见上文)中 TextureName 指定的纹理颜色。
  • Constant 是在 ConstantColor 中指定的颜色。

修改器

  • 以上指定的公式可以选择使用关键字 DoubleQuad类似于平面的基本对象,但其边仅有一个单元长,仅使用 4 个顶点,并且表面以局部坐标空间的 XY 平面为方向。 更多信息
    请参见 术语表
    使所得颜色亮度提高 2 倍或 4 倍。
  • 除了 lerp 参数之外,所有 src 属性在前面可选择加上 one - 使得所得颜色取反。
  • 所有 src 属性后面可跟 alpha,仅取 alpha 通道。

纹理块 ConstantColor 命令

ConstantColor color: 定义可在合并命令中使用的常量颜色。

Unity 5.0 中已移除的功能

5.0 之前的 Unity 版本支持使用纹理块内的 matrix 命令对纹理坐标进行转换。如果您现在需要此功能,请考虑将着色器重写为 可编程着色器,并在 顶点着色器3D 模型在渲染时在其每个顶点上运行的程序。 更多信息
请参见 术语表
中进行 UV 转换。

类似地,5.0 移除了有符号加法 (a+-b)、有符号加法乘 (a*b+-c)、乘法减法 (a*b-c) 和点乘 (dot3dot3rgba) 纹理组合模式。如果需要它们,请在 像素计算机图像中的最小单位。像素大小取决于您的屏幕分辨率。像素照明在每个屏幕像素处计算。 更多信息
请参阅 词汇表
着色器中进行数学运算。

详细信息

片段程序 诞生之前,较老的显卡采用分层方法处理纹理。这些纹理会逐个应用,修改将要写到屏幕上的颜色。对于每个纹理,纹理通常与前一个操作的结果相结合。当今建议使用实际片段程序。

请注意,每个纹理阶段可能会或可能不会被固定到 0..1 范围,具体取决于平台。这可能会影响能够产生高于 1.0 值的 SetTexture 阶段。

单独的 Alpha & 颜色计算

默认情况下,组合器公式用于计算颜色的 RGB 和 Alpha 分量。您还可以为 Alpha 计算指定一个单独的公式。如下所示

SetTexture [_MainTex] { combine previous * texture, previous + texture }

在此,我们乘以 RGB 颜色并添加 Alpha。

镜面高光

默认情况下,主要颜色是漫射色、环境光和 镜面色镜面高光的颜色。
请参阅 词汇表
(如 照明计算 中定义的那样)的总和。如果您在通过选项中指定独立镜面 On,镜面色将组合器计算之后而不是之前添加。这是内置 VertexLit 着色器的默认行为。

显卡硬件支持

支持 片段着色器 的现代显卡(台式机上的“着色器模型 2.0”)支持所有 SetTexture 模式,且至少支持 4 个纹理阶段(其中许多支持 8 个)。如果您正在运行非常旧的硬件(PC 上 2003 年前制造的,或移动设备上 iPhone3GS 之前制造的),您可能会只有两个纹理阶段。着色器作者应为他们想要支持的显卡编写单独的 子着色器

示例

混合两个纹理的 Alpha

这个小型示例采用了两个纹理。首先,它设置第一个组合器只是取_MainTex,然后使用_BlendTex 的 Alpha 通道淡入_BlendTex 的 RGB 颜色

Shader "Examples/2 Alpha Blended Textures" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
    }
    SubShader {
        Pass {
            // Apply base texture
            SetTexture [_MainTex] {
                combine texture
            }
            // Blend in the alpha texture using the lerp operator
            SetTexture [_BlendTex] {
                combine texture lerp (texture) previous
            }
        }
    }
}

自发光 Alpha 控制

该着色器使用 **_MainTex** 的 alpha 组件来决定在何处应用光照。它通过将纹理应用于两个阶段来实现此目的;在第一阶段,使用纹理的 alpha 值在顶点颜色和纯白色之间进行混合。在第二阶段,将纹理的 RGB 值相乘。

Shader "Examples/Self-Illumination" {
    Properties {
        _MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
    }
    SubShader {
        Pass {
            // Set up basic white vertex lighting
            Material {
                Diffuse (1,1,1,1)
                Ambient (1,1,1,1)
            }
            Lighting On

            // Use texture alpha to blend up to white (= full illumination)
            SetTexture [_MainTex] {
                constantColor (1,1,1,1)
                combine constant lerp(texture) previous
            }
            // Multiply in texture
            SetTexture [_MainTex] {
                combine previous * texture
            }
        }
    }
}

不过,我们可以在此免费执行其他操作;不是与纯白色混合,而是可以添加一个自发光颜色并混合到该颜色。请注意,使用 **ConstantColor** 从属性获取 _SolidColor,将其混合到纹理中。

Shader "Examples/Self-Illumination 2" {
    Properties {
        _IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
        _MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
    }
    SubShader {
        Pass {
            // Set up basic white vertex lighting
            Material {
                Diffuse (1,1,1,1)
                Ambient (1,1,1,1)
            }
            Lighting On

            // Use texture alpha to blend up to white (= full illumination)
            SetTexture [_MainTex] {
                // Pull the color property into this blender
                constantColor [_IlluminCol]
                // And use the texture's alpha to blend between it and
                // vertex color
                combine constant lerp(texture) previous
            }
            // Multiply in texture
            SetTexture [_MainTex] {
                combine previous * texture
            }
        }
    }
}

最后,我们要采用 vertexlit 着色器的所有光照属性,并将其拉入

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 {
            // Set up basic vertex lighting
            Material {
                Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emission]
            }
            Lighting On

            // Use texture alpha to blend up to white (= full illumination)
            SetTexture [_MainTex] {
                constantColor [_IlluminCol]
                combine constant lerp(texture) previous
            }
            // Multiply in texture
            SetTexture [_MainTex] {
                combine previous * texture
            }
        }
    }
}
ShaderLab:旧版 alpha 测试
ShaderLab:旧版顶点数据通道映射