返回介绍

ShaderLab语法:混合(Blending)

发布于 2021-06-20 00:15:04 字数 3160 浏览 814 评论 0 收藏 0

混合用于制作透明对象。

渲染图形时,执行所有着色器且应用所有纹理之后,将像素写入屏幕。混合 (Blend) 命令控制这些像素如何与已有像素混合。

语法

Blend Off
关闭混合
Blend SrcFactor DstFactor
配置和启用混合。生成的颜色乘以 SrcFactor。已在屏幕上的颜色乘以 DstFactor,然后两者相加。
Blend SrcFactor DstFactor, SrcFactorA DstFactorA
与上述操作相同,但是混合 alpha 通道要使用不同的因子
BlendOp Min | Max | Sub | RevSub
不将混合颜色相加,而是对它们进行不同的操作。

属性

以下属性对 SrcFactor 和 DstFactor 都有效。源颜色 (Source) 是指已计算的颜色,目标颜色 (Destination)指已显示在屏幕上的颜色。

One值为 1 - 用它可使源颜色或目标颜色完全显示出来。
Zero值为 0 - 用它可删除源颜色值或者目标颜色值。
SrcColor这个阶段的值乘以源颜色值。
SrcAlpha这个阶段的值乘以源 alpha 值。
DstColor这个阶段的值乘以帧缓存源颜色值。
DstAlpha这个阶段的值乘以帧缓存源 alpha 值。
OneMinusSrcColor这个阶段的值乘以(1 - 源颜色之间的值)。
OneMinusSrcAlpha这个阶段的值乘以(1 - 源颜色 alpha 之间的值)。
OneMinusDstColor这个阶段的值乘以(1 - 目标颜色之间的值)。
OneMinusDstAlpha这个阶段的值乘以(1 - 目标颜色 alpha 之间的值)。

详细信息

以下是最常见的混合类型:

Blend SrcAlpha OneMinusSrcAlpha     // Alpha 混合
Blend One One                       // 相加
Blend OneMinusDstColor One          // 柔和相加
Blend DstColor Zero                 // 相乘
Blend DstColor SrcColor             // 2 倍相乘

示例

以下是一个小的示例着色器,它可以在已显示在屏幕上的任何东西上添加纹理:

Shader "Simple Additive" {
    Properties {
        _MainTex ("Texture to blend", 2D) = "black" {}
    }
    SubShader {
        Tags { "Queue" = "Transparent" }
        Pass {
            Blend One One
            SetTexture [_MainTex] { combine texture }
        }
    }
}

下面是一个复杂的示例着色器,玻璃 (Glass)。它是一个双通道着色器:

  1. 第一个通道将一个光照、alpha 混合纹理渲染至屏幕。Alpha 通道决定透明度。
  2. 第二个通道使用附加透明度渲染 alpha 混合窗口顶部的一个反射立方体贴图。
Shader "Glass" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "white" {}
        _Reflections ("Base (RGB) Gloss (A)", Cube) = "skybox" { TexGen CubeReflect }
    }
    SubShader {
        Tags { "Queue" = "Transparent" }
        Pass {
            Blend SrcAlpha OneMinusSrcAlpha
            Material {
                Diffuse [_Color]
            }
            Lighting On
            SetTexture [_MainTex] {
                combine texture * primary double, texture * primary
            }
        }
        Pass {
            Blend One One
            Material {
                Diffuse [_Color]
            }
            Lighting On
            SetTexture [_Reflections] {
                combine texture
                Matrix [_Reflection]
            }
        }
    }
} 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文