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() をしてやればよい。