Version: 6000.3
语言: 中文
ShaderLab:传统的 alpha 测试
ShaderLab:旧版顶点数据通道映射

ShaderLab:传统纹理组合

注意:该ShaderLabUnity 用于定义 Shader 对象结构的语言。更多信息
请参阅术语表
此页面上的功能是旧版的,仅用于向后兼容性。如果您的着色器在 GPU 上运行的程序。更多信息
请参阅术语表
源文件包含 HLSL 代码,Unity 会完全忽略这些命令。如果您的着色器源文件不包含 HLSL 代码,Unity 会在导入时将这些命令编译为常规着色器程序。

渲染管线兼容性

功能名称 内置渲染管线(Render Pipeline) 获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管道中进行选择,或编写自己的渲染管道。更多信息
请参阅术语表
通用渲染管线(URP) 高清渲染管线 (HDRP) 定制 SRP
传统纹理组合 是的

概述

计算基本顶点光照后,将应用纹理。在ShaderLab中,这是使用SetTexture命令完成的。

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

语法

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 (src2src3:使用 src2 的 alpha 在 src3 和 src1 之间进行插值。请注意,插值方向相反:当 alpha 为 1 时使用 src1,当 alpha 为零时使用 src3。

combine src1 * src2 + src3:将 src1 与 src2 的 alpha 分量相乘,然后将 src3 相加。

所有 src 属性都可以是 previousconstantprimarytexture 之一。

  • Previous 是上一个 SetTexture 的结果。
  • 主色是光照计算中的颜色,或者顶点颜色(如果已绑定)。
  • Texture 是 SetTexture 中的 TextureName 指定的纹理的颜色(见上文)。
  • Constant 是在 ConstantColor 中指定的颜色。

修饰 符:

  • 上面指定的公式可以选择在关键字 Double四边形一种类似于平面但其边只有一个单位长的基元对象,它仅使用 4 个顶点,并且表面定向在局部坐标空间的 XY 平面上。更多信息
    请参阅术语表
    使生成的颜色亮度提高 2 倍或 4 倍。
  • 所有 src 属性,但lerp参数,可以选择在前面加上 1 - 以使生成的颜色被否定。
  • 所有 src 属性后面都可以跟 alpha 以仅采用 alpha 通道。

纹理块constantColor命令

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

在 Unity 5.0 中删除的功能

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

同样,5.0 删除了签名添加 (a+-b)、乘号加法 (a*b+-c)、乘法减去 (a*b-c) 和点积 (dot3,dot3rgba) 纹理组合模式。如果需要它们,请在像素计算机图像中的最小单位。像素大小取决于您的屏幕分辨率。像素光照是在每个屏幕像素下计算的。更多信息
请参阅术语表
shader 代替。

碎片程序存在之前,较旧的显卡使用分层纹理方法。纹理一个接一个地应用,修改将写入屏幕的颜色。对于每个纹理,纹理通常与上一个作的结果组合在一起。如今,建议使用实际的片段程序。

请注意,每个纹理阶段可能会也可能不会被限制在 0..1 范围内,具体取决于平台。这可能会影响可以生成高于 1.0 的值的 SetTexture 阶段。

分离的 Alpha 和颜色计算

默认情况下,组合器公式用于计算颜色的 RGB 和 alpha 分量。或者,您可以为 alpha 计算指定单独的公式。这看起来像这样:

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

在这里,我们将 RGB 颜色相乘并添加 alpha。

镜面反射高光

默认情况下,原色是漫反射、环境和镜面反射颜色镜面反射高光的颜色。
请参阅术语表
(如光照计算中定义)。如果在通道选项中指定 SeparateSpecular On,则镜面反射颜色将在组合器计算之后添加,而不是在计算之前添加。这是内置 VertexLit 着色器的默认行为。

图形硬件支持

支持片段着色器的现代显卡(桌面上的“着色器模型 2.0”)支持所有 SetTexture 模式和至少 4 个纹理阶段(其中许多支持 8 个)。如果您在非常旧的硬件上运行(2003 年之前在 PC 上制造,或在移动设备上 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
            }
        }
    }
}

最后,我们获取顶点着色器的所有光照属性并将其拉入:

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:旧版顶点数据通道映射