关于 DXT1 格式的解码优化

DXT1 使用的是 4x4 像素一个单元. 两个 16bit 的调色盘. 
如果没有透明色的话, 还需要插值出 2 种颜色.

c2=c0*2/3+c1*1/3
c3=c0*1/3+c1*2/3

因为两个色盘正好可以读进一个 dword 寄存器, 所以我们可以把 c0, c1 两种颜色读到两个寄存器中. 方便计算. 类似的代码可以写成这样:

mov eax,[pal]
mov ebx,eax
swap ax,bx

接下来做 alpha 混合的时候可以继续取掩码, 把 RGBRGB 变成 0G0R0B 的方式计算.

这种混合运算其实可以优化为 (c0*21+c1*11)/32.

a*21+b*11 有优化的余地:

__inline int blander_internal(unsigned a,unsigned b)
{
b+=a; // b=a+b
a+=b; // a=2*a+b
b+=a; // b=3*a+2*b
a*=9; // a=18*a+9*b
return a+b; // 21*a+11*b;
}

用汇编写也可以. 但是不会比编译器强多少 :)

如果使用 mmx, 则可以考虑一次处理 4 个像素. DXT1 中 4 个像素正好一个字节(一个像素两个bit) 这样可以比较方便的使用查表.

00: c0*2/3+c0*1/3
01: c1*2/3+c1*1/3
10: c0*2/3+c1*1/3
11: c1*2/3+c0*1/3

这样, 就变成了 a * 2/3 + b *1/3 的统一式子, 查表来决定 a 和 b 取 c0 还是 c1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值