DirectDraw カラーキーについて
DirectDraw のカラーキーは,実際のハードウェア,BPP などに対応する値を指定してやる必要がある。1 番確実な方法はサンプルのように,サーフェスに GDI で描画をし,値を読み出すこと。
DWORD CDirectDraw::DDColorMatch(LPDIRECTDRAWSURFACE pSurface, COLORREF rgb)
{
DWORD result;
COLORREF oldrgb;
HDC hdc;
// GDI を使って色を置く
if(rgb != CLR_INVALID && pSurface->GetDC(&hdc) != DD_OK)
{
return 0;
}
// 前の値を保持
oldrgb = ::GetPixel(hdc, 0, 0);
// 色を置いてみる
::SetPixel(hdc, 0, 0, rgb);
pSurface->ReleaseDC(hdc);
// ハードウェア依存の値を読み込む
DDSURFACEDESC ddsd;
ddsd.dwSize = sizeof(DDSURFACEDESC);
HRESULT hres;
while((hres = pSurface->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING)
{
;
}
if(hres == DD_OK)
{
result = *(DWORD *)ddsd.lpSurface;
// BPP に対する修正
if(ddsd.ddpfPixelFormat.dwRGBBitCount < 32)
{
result &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1;
}
pSurface->Unlock(NULL);
}
// 書き込んだ値を元に戻す
if(rgb != CLR_INVALID && pSurface->GetDC(&hdc) != DD_OK)
{
return 0;
}
// 色を置いてみる
::SetPixel(hdc, 0, 0, oldrgb);
pSurface->ReleaseDC(hdc);
return result;
}
Direct3D,メッシュを見えなくするには,Frame.DeleteVisual すればよいが,メッシュの参照がなくなり,メッシュが削除され,もう 1 度表示するときに困る。これを防ぐには先に Mesh->AddRef() をしてやればよい。