DirextX9之2D编程 通过16位色位图创建背景透明的纹理

首先资源是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;


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值