【DirectXプログラミング】描画について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シエル

【DirectXプログラミング】描画について

#1

投稿記事 by シエル » 15年前

いつもお世話になっております。

DirectXのスプライト描画とDIRECT3Dデバイスの描画について質問があります。
最近DirectX関連の質問が多くて申し訳ありません。。。

現在ゲーム作成中で、ID3DXSprite インターフェイスでの描画とDIRECT3DデバイスのDrawPrimitiveUpメソッド
を使って描画をしております。

DrawPrimitiveUpメソッドの描画の際に、アルファブレンドやテクスチャブレンドの設定を変えて描画するのですが、その変更内容が、同じデバイスを使用しているスプライトの描画にも影響が出てしまいました。
対応方法として、DrawPrimitiveUpメソッドでの描画が終わってから、ブレンドの設定を全て戻す
ことによって、スプライトでの描画には影響が出ないようにしています。

ですが、描画するたびにブレンドの設定を何度も変更したり戻したりするので、
速度にも影響が出るし、効率が悪いかな~と思いました。

そこで考えたのが、

・スプライト
・DrawPrimitiveUp(通常用)
・DrawPrimitiveUp(加算合成用)
・DrawPrimitiveUp(減算合成用)

という、それぞれ専用のデバイスを作成しようと考えました。
これなら、一番最初にそれぞれのデバイスでブレンドの設定をしてしまえば、途中でブレンドの設定を変更
する必要が無いし、描画する際はデバイスを使い分けて描画すればいいと考えました。

皆さんにはどちらの方法が効率が良いのかお聞きしたいのですが、
デバイスを一つだけ作成して、ブレンド設定を都度変更しながら描画する方法と、
デバイスを複数作成して、ブレンド設定は最初だけ行い、デバイスを使い分けて描画する方法と
どちらが良いと思われますでしょうか?

DirectXを始めてからまだ日が浅いので、言葉じりがおかしかったりするところも
あると思いますが、ご回答よろしくお願い致します。

Justy

Re:【DirectXプログラミング】描画について

#2

投稿記事 by Justy » 15年前

>専用のデバイスを作成
 これは Direct3DDeviceですか?
 普通は Direct3DDeviceの生成は1アプリに1つです。
 少なくともレンダーステートが異なるからという理由だけで増やすことはないです。


>ブレンド設定を都度変更しながら描画する方法
 こちらの方法でいいと思います。

 効率が気になるなら同じレンダーステートのオブジェクトを一纏めにして描画するとか
これから描画するオブジェクトのレンダーステートを個々に調べ、異なるステートのものだけを
設定するようにするとか、ステート管理をシステム化すればいいかと。

シエル

Re:【DirectXプログラミング】描画について

#3

投稿記事 by シエル » 15年前

Justyさん!いつもありがとうございます!

>これは Direct3DDeviceですか?
>普通は Direct3DDeviceの生成は1アプリに1つです。
>少なくともレンダーステートが異なるからという理由だけで増やすことはないです。
Direct3DDeviceのことです。
普通は一つなんですね。。。

>効率が気になるなら同じレンダーステートのオブジェクトを一纏めにして描画するとか
>これから描画するオブジェクトのレンダーステートを個々に調べ、異なるステートのものだけを
>設定するようにするとか、ステート管理をシステム化すればいいかと。
ステート管理をシステム化ですか…うぅ…頑張ってみます…

シエル

Re:【DirectXプログラミング】描画について

#4

投稿記事 by シエル » 15年前

一応解決にしときます。

シエル

Re:【DirectXプログラミング】描画について

#5

投稿記事 by シエル » 15年前

すみません。追加で質問させてください。。。

テクスチャの読み込みは下記のように、黒を「透明色」と指定して読み込んで、
画像の黒色部分を透過させて、描画していました。

hr = D3DXCreateTextureFromFileEx(lp3ddev,filename,imageinfo.Width,imageinfo.Height,1,0,
D3DFMT_UNKNOWN,D3DPOOL_MANAGED,D3DX_FILTER_TRIANGLE,D3DX_FILTER_TRIANGLE,D3DCOLOR_ARGB(255,0,0,0),NULL,NULL,&Imageinfo[texturepoint].lptexture);

ですが、以下のようにテクスチャステージ「透明度」の設定をディフューズ色の透明度のみ、
と設定すると、なぜか透明色で透明だった画像の背景が真っ黒になって描画されてしまいました。

lp3ddev->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
lp3ddev->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
lp3ddev->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
lp3ddev->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
lp3ddev->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);

ちなみに、透明度をテクスチャの透明度のみとして設定してしまうと、スプライトで描画した際に
背景は透過されましたが、画像の半透明描画が出来なくなってしまいました。

このテクスチャステージの設定は、「透明度」の設定を行っているはずなのに、
なぜ「透明色」の設定にまで影響が出てしまうのでしょうか?

考え方が破綻していたら、申し訳ありません。。。

Justy

Re:【DirectXプログラミング】描画について

#6

投稿記事 by Justy » 15年前

>透明色で透明だった画像の背景が真っ黒になって描画されてしまいました
 状況をまとめると、

・ カラーキーを使って透明にしたテクスチャがある
・ 透明度をディフューズカラーのみにした

 結果、カラーキーで指定した部分が黒くなった、ということですね。
 それはそうです。テクスチャのアルファ値を無効にしたわけですから。


>このテクスチャステージの設定は、「透明度」の設定を行っているはずなのに、
>なぜ「透明色」の設定にまで影響が出てしまうのでしょうか?
 カラーキー(透明色)は DirectXのテクスチャを生成する段階で判定が行われ
A8R8G8B8や A1R5G5B5などのアルファ付きテクスチャに変換されます。

 このテクスチャを表示しようとするわけですから、テクスチャの透明度を加味しないと
元々抜き色だった部分は透過されないことになります。

シエル

Re:【DirectXプログラミング】描画について

#7

投稿記事 by シエル » 15年前

おお!イメージどおりに透過できました!三日ぐらい悩んでたので…本当に助かりました…!

すごく分かりやすい説明がありがとうございます!

すいません。最後にもう一つだけ…

Justyさんは、テクスチャの透明色を指定する方法として、D3DXCreateTextureFromFileEx関数を使って、
カラーキーを指定する方法にしてますか?
それとも、グラフィックソフトで直接透明色を指定する方法にしてますか?

Justy

Re:【DirectXプログラミング】描画について

#8

投稿記事 by Justy » 15年前

>グラフィックソフトで直接透明色を指定する方法にしてますか?
 こっちです。
 カラーキーはほとんど、というか全く使わないです。

シエル

Re:【DirectXプログラミング】描画について

#9

投稿記事 by シエル » 15年前

何度もありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る