首先资源是16位色的,首先创建一个纹理D3DXCreateTexture,颜色格式为D3DFMT_R5G6B5,加载数据,完成后将该纹理的表面复制到另一个D3DFMT_A8R8G8B8格式的纹理中,以下是代码:
function CreateTextureByBmp(Device: IDirect3DDevice9; Bmp: TBitmap; ColorKey: Cardinal): IDirect3DTexture9;
var
srcTexture: IDirect3DTexture9;
lockRc: TD3DLockedRect;
srcSurface, dstSurface: IDirect3DSurface9;
P1, P2: PByte;
N, I: Integer;
begin
//接下来创建一个与Bmp颜色格式相同的,这里假设是pf16bit
D3DXCreateTexture(Device, Bmp.Width, Bmp.Height, 1, 0, D3DFMT_R5G6B5, D3DPOOL_MANAGED, srcTexture);
//锁内存,准备写数据到纹理
srcTexture.LockRect(0, lockRc, nil, 0);
P2 := PByte(lockRc.pBits);
N := Bmp.Width * 2;
for I := 0 to Bmp.Height - 1 do
begin
P1 := Bmp.ScanLine[I];
Move(P1^, P2^, N);//bmp的内存数据是每行倒着存在内存中的,所以要一行一行的复制
Inc(P2, N);
end;
srcTexture.UnlockRect(0);//写纹理数据完成
D3DXCreateTexture(Device, Bmp.Width, Bmp.Height,//高宽与源纹理不一样,自动缩放
1, 0, D3DFMT_A8R8G8B8,//一定是带透明通道
D3DPOOL_MANAGED, Result);
Result.GetSurfaceLevel(0, dstSurface);//获取目标表面
srcTexture.GetSurfaceLevel(0, srcSurface);//获取源表面
//复制表面数据(256色以下才需要调色板,完全复制区域也不用设了)
D3DXLoadSurfaceFromSurface(dstSurface, nil, nil, srcSurface, nil, nil,
D3DX_FILTER_LINEAR,//线性缩放时方式(个人理解)
ColorKey);//注意16位色的黑色要使用$FF000000作为ColorKey,如果只缩放不透明这里使用0就可以了
FreeAndNil(Bmp);
end;