私はVBでのゲーム制作を行っているのですが半透明の処理が必要になりました。
それもDirectDrawを使用している場合のです。
BitBltの場合は透明度を変更できない制限がある物もAND(だったはず)で実現できたのですがDirectDrawはそうはいきませんでした。それに透明度も調節がしたいのです。Direct3Dのテクスチャーにたよらずに何かいい方法は無いでしょうか?
追記:使用するオブジェクトはDirectX7及びDirectDraw,DirectSurface7です。
表示はフォームのデバイスコンテキストを通していません。
初めて書き込みします。
以前、VB.NET+DX7で試したのですが、
DirectDrawを使ってアルファブレンドする方法はないみたいです。
それらしいものがあるにはあるのですが、規格が用意してあるだけで、DX7には実装されていませんでした。
やはりDirect3Dに頼るしかないでしょうか・・・
ただその場合今の私の知識では長方形しか表示できないんですよね・・・
せめて長方形以外の描画方法が見つかればいいのですが
長方形というのはDirect3Dの面のことですか?
それができれば、あとはアルファブレンドしたい画像をテクスチャーとして読み込んで、その面に貼り付けて、マテリアルのアルファ成分を調整すればOKです。
そんなに難しくないのでDirect3Dで試してはどうですか?
つまりDirect3DのテクスチャーにもDirectDrawSurfaceのカラーキーでの透過ブリットに相当する物があるということでしょうか?
実はマテリアル設定はしたこと無い上SDK見てもあまり分からなかったのでできれば教えてほしいのですが。
Direct3Dでもカラーキーは使えますが、
それとは別にアルファブレンドの機能が備わっているのでそれをONにしてあげます。
そしてブレンドの際、透過率としてマテリアルのアルファ値を使ったりすれば良いのではないでしょうか。
それと、マテリアルの設定は(Direct3DIMの話ですが)
まずDirect3DDeviceのSetRenderStateでアンビエント(空間に均一に広がる無指向性の光)やディフューズ(方向性のある光)を設定してあげます。
次にDirect3DDeviceのSetMaterialでオブジェクトの色を決定します。
チュートリアルを一度試すと結構理解できるので試してはいかかでしょうか?
半透明処理自体は3DDeviceとそのテクスチャー処理及びアルファブレンド値で解決したのですがバックサーフェスとテクスチャー全体の画像が合わさった画像がバックサーフェスに返されてしまいます。テクスチャーの一部のみを完全に透明に見せるような処理はできないのでしょうか?
思いついたのではテクスチャーに一度バックサーフェスの内容をブリットし、表示したい画像をその上から透過ブリットを行うという方法なのですが、これでは処理時間がかかりすぎました。
>テクスチャーの一部のみを完全に透明に見せるような処理はできないのでしょうか?
アルファブレンドではなく、透過処理の方ですか?
透過処理だけならDirectDrawだけでもできるのですが、
もし、アルファブレンドをしつつ透過処理をしたいのであれば、Direct3DでアルファブレンドしてからDirectDrawで透過すれば良いと思います。
あと、それ以外にも、ピクセル単位で画像自体にアルファ値を埋め込むこともできます。
どのようにしたいのかイメージが沸かないので、もう少し詳しく書いていただけると説明ができるのですが・・・
例えば、
画像をだんだん浮かせるフェードインをしたいとか、(アルファ値が動的)
透明具合が固定の画像を用意しておきたいとか、(アルファ値が固定)
まさに前者です。
透過ブリットをアルファブレンドで表示したいのです。
フェードイン、フェードアウトなどが可能なようにアルファ値は任意で。
今のところは2/10カキコのやり方で誤魔化してはいるのですがはっきり言って処理が重いです。
もちろんピクセル単位なんていうのはもっと処理かかるでしょうから・・・
それで何をするかも説明しておきますと、各種ゲームでのエフェクの処理をブリットによるアニメだけの処理から半透明処理を加えたものに変更しようとしていたのですが、これまで透過ブリットを多用してきているので透過もできないとつらいというか・・・
何よりテクスチャーの大きさが限られているのが痛いですね・・・
ツイート | ![]() |