问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用 alpha 通道的纹理

创作时间:
作者:
@小白创作中心

使用 alpha 通道的纹理

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/windows/uwp/graphics-concepts/textures-with-alpha-channels

在Windows UWP应用开发中,使用alpha通道的纹理是实现复杂透明度效果的关键技术。本文将详细介绍两种主流的纹理编码方法:显式纹理编码(BC2格式)和三位线性alpha内插(BC3格式)。通过深入解析每种方法的实现原理、内存布局和具体算法,帮助开发者掌握这一核心技术。

本文内容

有两种方法可用于对展现更复杂透明度的纹理贴图进行编码。 在每种情况下,描述透明度的块都在已描述的 64 位块之前。 透明度以 4 x 4 位图表示,其中每个像素具有 4 位(显式编码)或者具有更少位和线性插值(与用于颜色编码的值类似)。

透明数据块和颜色块的排列方式如下表所示。

字地址
64 位块
3:0
透明数据块
7:4
之前所述的 64 位块

显式纹理编码

对于显式纹理编码(BC2 格式),描述透明度的纹素的 alpha 组件采用 4x4 位图编码,每个像素为 4 位。 这些四位组可以通过多种方式实现,比如抖动或通过使用四个最高有效位的 alpha 数据。 但它们只能产生并且按本身用途使用,不得有任何形式的内插。

以下图表显示 64 位透明数据块。

注意Direct3D 压缩法使用四个最高有效位。

下表描述了 alpha 信息(16 位词)如何在内存中分布。

word 0 的布局:

Bits
Alpha
3:0 (LSB*)
[0][0]
7:4
[0][1]
11:8
[0][2]
15:12 (MSB*)
[0][3]

*最低有效位,最高有效位 (MSB)

word 1 的布局:

Bits
Alpha
3:0 (LSB)
[1][0]
7:4
[1][1]
11:8
[1][2]
15:12 (MSB)
[1][3]

word 2 的布局:

Bits
Alpha
3:0 (LSB)
[2][0]
7:4
[2][1]
11:8
[2][2]
15:12 (MSB)
[2][3]

word 3 的布局:

Bits
Alpha
3:0 (LSB)
[3][0]
7:4
[3][1]
11:8
[3][2]
15:12 (MSB)
[3][3]

在 BC1 中用于确定纹素是否透明的颜色对比并没有使用这种格式。 假定在没有颜色对比的情况下,始终将颜色数据处理成 4 颜色模式。

三位线性 alpha 内插

BC3 格式的透明度编码概念与针对颜色的线性编码的相似。 两个 8 位 alpha 值以及一个 4x4 位图(每个像素为 3 位)保存在块的前八个字节中。 典型的 alpha 值用于插入中间 alpha 值。 其他信息则在两个 alpha 值保存的过程中提供。 如果 alpha_0 大于 alpha_1,则六个中间 alpha 值可以通过插入的形式创建。 或者,四个中间 alpha 值可以插入指定的 alpha 极值之间。 其他两个隐式 alpha 值分别为 0(完全透明)以及 255(完全不透明)。

以下代码示例描述了此算法。

// 8-alpha or 6-alpha block?    
if (alpha_0 > alpha_1) {    
    // 8-alpha block:  derive the other six alphas.    
    // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
    alpha_2 = (6 * alpha_0 + 1 * alpha_1 + 3) / 7;    // bit code 010
    alpha_3 = (5 * alpha_0 + 2 * alpha_1 + 3) / 7;    // bit code 011
    alpha_4 = (4 * alpha_0 + 3 * alpha_1 + 3) / 7;    // bit code 100
    alpha_5 = (3 * alpha_0 + 4 * alpha_1 + 3) / 7;    // bit code 101
    alpha_6 = (2 * alpha_0 + 5 * alpha_1 + 3) / 7;    // bit code 110
    alpha_7 = (1 * alpha_0 + 6 * alpha_1 + 3) / 7;    // bit code 111  
}    
else {  
    // 6-alpha block.    
    // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
    alpha_2 = (4 * alpha_0 + 1 * alpha_1 + 2) / 5;    // Bit code 010
    alpha_3 = (3 * alpha_0 + 2 * alpha_1 + 2) / 5;    // Bit code 011
    alpha_4 = (2 * alpha_0 + 3 * alpha_1 + 2) / 5;    // Bit code 100
    alpha_5 = (1 * alpha_0 + 4 * alpha_1 + 2) / 5;    // Bit code 101
    alpha_6 = 0;                                      // Bit code 110
    alpha_7 = 255;                                    // Bit code 111
}

alpha 块的内存布局如下所示:

Byte
Alpha
0
Alpha_0
1
Alpha_1
2
[0][2] (2 MSB)、[0][1]、[0][0]
3
[1][1] (1 MSB)、[1][0]、[0][3]、[0][2] (1 LSB)
4
[1][3]、[1][2]、[1][1] (2 LSB)
5
[2][2] (2 MSB)、[2][1]、[2][0]
6
[3][1] (1 MSB)、[3][0]、[2][3]、[2][2] (1 LSB)
7
[3][3]、[3][2]、[3][1] (2 LSB)

在 BC1 中用于确定纹素是否透明的颜色对比并没有使用这些格式。 假定在没有颜色对比的情况下,始终将颜色数据处理成 4 颜色模式。

本文原文来自微软官方文档

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号