虽然传统的用含遮罩信息的24bit图片来保存一个32bit的图像已经很少见了(以前的游戏比较常见),基本上随着png的流行,已经让32bit格式的图像普及网络以及游戏界了,当然更多的游戏采用dx原生支持的dds,或者可以自定义形状的更加灵活的tga格式等.不过这里还是介绍下在DX下Mask的实现,因为我的项目里涉及到可能要使用旧的游戏资源.
储存mask信息的图片:
D3DLOCKED_RECT locked_rect;
temp->tex->tex->LockRect(0, &locked_rect, NULL, 0);
BYTE *pByte = (BYTE *) locked_rect.pBits;
BYTE *pmaskByte = (BYTE *) locked_rect.pBits + width*4;
int iOffset = locked_rect.Pitch/2; //偏移字节数
int i=0;
for( int iRow=0; iRow<height; iRow++ )
{
for( int iCol=0; iCol<width; iCol++ )
{
masked_pixel_buf[i] = pByte[0];
masked_pixel_buf[i+1] = pByte[1];
masked_pixel_buf[i+2] = pByte[2];
masked_pixel_buf[i+3] = 0xff - pmaskByte[0];
i += 4;
pByte += 4;
pmaskByte += 4;
}
pByte += iOffset;
pmaskByte += iOffset;
}
temp->tex->tex->UnlockRect(0);
temp->tex->tex->Release();
实现mask后的效果:
来源:oschina
链接:https://my.oschina.net/u/657180/blog/200215