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

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

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

#1

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

お世話になります。シエルです。

現在、シューティングゲームを作成中なのですが、
DirectXプログラミングの描画について、質問があります。

【質問①】画面の綺麗なぼやけについて

ゲームオーバー時の画面や途中でストップしたときに、現在のプレイ中の画像を少し
ぼやかしたような描画をしたいのですがどのような方法を行えばよろしいでしょうか?

現在私が行っている方法として、現在プレイ中の画面をその画面より小さなテクスチャにレンダリングし、
そのテクスチャを拡大して、再度画面に描画するという方法を取っているのですが、たしかにぼやけはするものの
拡大してるので画像が少し粗くなってしまいます。

どうすれば綺麗にぼやけを表現できるでしょうか?
目標としては、東方地霊殿の体験版でプレイ中にエスケープキーを押して
ストップしたときのあのぼやける感じが目標です。
(東方関連はこの体験版しか持ってません><)


【質問②】テクスチャに描画した際の画像の粗さについて

上の質問と少しかぶりますが、ステージクリアから次ステージに行くまでの間に
現在のプレイ画面をテクスチャに描画して、ロード中の文字と共に数秒間表示させているんですが、
そのテクスチャを描画すると実際のプレイしてる画面よりやや画像が粗くなってしまいます。
これはどのような原因が考えられるでしょうか?

方法としては、
下記のようにまず空のテクスチャを作っといて、そのサーフェイスを取得し、
バックバッファからそのテクスチャのサーフェイスに書き込んでいます。
当然ですが、StretchRectに指定しているRECT構造体の大きさとテクスチャのサイズは同じにしてます。
この処理が終わった後は、作成されたテクスチャをバックバッファにロード中の間、描画しているだけです。

D3DXCreateTexture(lp3ddev,450,610,1,D3DUSAGE_RENDERTARGET,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&fade);
fade->GetSurfaceLevel(0,&fades);

lp3ddev->StretchRect(backbuf,&rect,fades,NULL,D3DTEXF_LINEAR);

何かパラメータに問題がありますでしょうか?


以上の2点です。
ご教授のほど、よろしくお願い致します。

Justy

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

#2

投稿記事 by Justy » 15年前

>質問①

 東方地霊殿は持ってないので同じかどうかはわかりませんが、
よく使われるのはシェーダーを使う手です。

t-pot『ぼかしフィルター』
http://www.t-pot.com/program/51_bokashi/index.html
t-pot『ガウスフィルタ』
http://www.t-pot.com/program/79_Gauss/index.html


 シェーダーを使わない場合は、対象の画像の透明度を描画回数や位置に合わせて上げて、何度も微妙(0.5~1ピクセルとか)に左右上下、必要なら斜めに座標をずらしながら描くことです。
 そのずらして画像を使って再度同じようにずらして描くとさらにぼけていきますよ。


>質問②
 こっちはちょっと見てみないと判らないですけど、StretchRectの D3DTEXF_LINEARを D3DTEXF_NONEにしたらどうなりますか?


# 最初から空のテクスチャに描けば、こんなコピーしなくて済むんじゃ……。

シエル

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

#3

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

ぼかしはシェーダーですか・・・。
かなり難しそうですね。余裕があったらやってみます。

シェーダーを使わない方法も試してみました。
確かにある程度のクオリティは出せましたが、東方とまではいかないですね。
東方のぼかしはやはりシェーダーを使ってそうです。
この方法で行くかシェーダーを使うかはよく考えて決めていきます。

質問②の方ですが、ちょっとテクスチャマッピングで一部おかしな部分がありました。
そこを直したらおそらく解決すると思うので、こちらは大丈夫です。
ご迷惑をおかけしました。


># 最初から空のテクスチャに描けば、こんなコピーしなくて済むんじゃ……。

ええwその通りですw
最初からテクスチャをレンダリングターゲットに変更して描画しようとしてたんですが、
ビューポートの設定やら何やら色々問題が出てきたので、今の方法に行き着きました。
もうすこし理解度が高ければ、最初からテクスチャをレンダリングターゲットにして描画
してたんですけどね^^;
こちらはもっと勉強します!

とりあえず方法が分かったので、これにて解決と致します。

Justyさん!ありがとうございました!

閉鎖

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