シューティングゲーム(5)カラーキーの再現

公開:2009-12-10 17:33
更新:2020-02-15 04:36
カテゴリ:windows,シューティングゲーム,directx,game programming,c++,ゲーム,ゲーム製作

カラーキーっぽいことがようやくできた。

ソースコードはこれ。


{
// スプライトテクスチャの読み込み
// R:0x00,G:0x00,B:0x00,A:0xFFをカラーキーに見立てて読み込む。
// CPUからRead,Write可能なテクスチャとして、PNGビットマップを読み込む
D3DX10_IMAGE_LOAD_INFO d3d_image_load_info;
d3d_image_load_info.Usage = D3D10_USAGE_STAGING;
d3d_image_load_info.CpuAccessFlags = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
d3d_image_load_info.BindFlags = 0;
d3d_image_load_info.MipLevels = 1;
ID3D10ResourcePtr myship_tex;
ID3D10Texture2DPtr myship_tex2D;
hr = D3DX10CreateTextureFromFile( d3d_device_, L"myship.png", &d3d_image_load_info, NULL, &myship_tex, NULL );
BOOST_ASSERT(hr == S_OK);
// ID3D10Texture2Dインターフェースのクエリ
hr = myship_tex->QueryInterface(&myship_tex2D);
BOOST_ASSERT(hr == S_OK);
// テクスチャ情報を取得する
D3D10_TEXTURE2D_DESC desc;
myship_tex2D->GetDesc(&desc);
// テクスチャ情報を読み取れるよう、Mapする
D3D10_MAPPED_TEXTURE2D mapped_tex2d;
hr = myship_tex2D->Map(D3D10CalcSubresource( 0, 0, 1 ),D3D10_MAP_READ_WRITE,0,&mapped_tex2d);
BOOST_ASSERT(hr == S_OK);
// B8G8R8A8形式として読み込む
boost::uint32_t* pdata = reinterpret_cast<boost::uint32_t*>(mapped_tex2d.pData);
for(UINT i = 0,count = desc.Height * desc.Width;i < count ;++i)
{
boost::uint32_t data = *pdata;
if(data == 0xff000000)// A:0xff,R:0x00,G:0x00,B:0x00の場合、0クリアする
{
*pdata = 0;
}
++pdata;
}
myship_tex2D->Unmap(D3D10CalcSubresource( 0, 0, 1 ));
// GPU用?テクスチャを作成して、色を抜いたテクスチャをコピーする
// テクスチャの作成
::CD3D10_TEXTURE2D_DESC desc_gpu(desc.Format,desc.Width,desc.Height,1,1);
ID3D10Texture2DPtr gpu_tex2D;
hr = d3d_device_->CreateTexture2D(&desc_gpu,0,&gpu_tex2D);
BOOST_ASSERT(hr == S_OK);
// Resource Viewの作成
hr = d3d_device_->CreateShaderResourceView(gpu_tex2D.GetInterfacePtr(),0,&sprite_tex_);
BOOST_ASSERT(hr == S_OK);
// GPU間コピー
d3d_device_->CopyResource(gpu_tex2D.GetInterfacePtr(),myship_tex.GetInterfacePtr());
// 後始末(しなくても良いが)
myship_tex2D.Release();
myship_tex.Release();
}


テクスチャへのアクセスは伝統的なLock,Unlockかなと思ったがちがった。Map,UnMapに変わっていた。