S3のバグについて
よくゲームでオンボードのビデオやマイナーなメーカーのビデオカードが動作対象外に
書いてある事がある。
(メジャーはGeForce,Radeon)
これには3つの理由がある。
1).速度が遅い
2).動作検証してない
3).本当に動かない
2番はメーカーの手抜きであるが、実際のところ3番も結構あると思う。
幸いにもうちにはマイナーなものが揃っているのでその原因を探ってみた。
動作環境は以下の通り。
CPU | Celeron466MHz |
M/B | ECS P6VXA チップ VT82C694X,686B |
OS | WindowsMe(4.90,build3000) |
DirectX | 9.0a(4.09.0000.0901) |
ビデオカード | S3 Savage3D RevB(8MB) (6.13.13) |
ビデオドライバー | 4.11.0001.4005(1999/02/19) |
古いビデオカードなので1999年が最後のバージョンです。
1.伸縮バグ
bltで画像を引き伸ばすと特定の条件でフリーズする。
g_pDDSBack->Blt(&dr, g_pSprite, &sr, DDBLT_WAIT |
DDBLT_KEYSRC , NULL);
drとsrはRECT構造体である。
フリーズする条件は何度かパラメータを変えて実験した結果である。
(1)画面色深度が16ビットカラーである
(2)sr.right-sr.leftが4のとき
(3)sr.leftが4で割って余りが1もしくは2のとき
(4)dr.right-dr.leftが33以上のとき
横幅が5ピクセルを伸ばすときだけフリーズする。
これより大きかったり小さい時は問題ないみたい。
2.透明色
きちんと透明色指定してもbltの伸縮させるとうまく透明色が抜けない。
例えば透明色をRGB(255,0,255)とした場合で
DDCOLORKEY ddckey;
int color=RGB(255,0,255);
ddckey.dwColorSpaceLowValue = DDColorMatch(g_pSprite, color );
ddckey.dwColorSpaceHighValue = DDColorMatch(g_pSprite, color );
g_pSprite->SetColorKey(DDCKEY_SRCBLT,&ddckey);
という場合である。
どうもbltルーチンの内部で色の計算に間違いがあると思われる。
伸縮の時に色情報にアンチエイリアスがかかっているのではないでしょうか?
これを解決するにはRGB(0,0,0)を透明色として設定すること。
※Savage4やSavage2000,VIAビデオ機能統合チップセットで同じ現象があるか分かりません。