トップページ > 過去ログ > 記事閲覧
画像のギザギザを滑らかにしたい
名前:dixq 日時: 2008/06/17 03:02

いつもお世話になっています。今回は題名の件で質問させて頂きます。 よろしくお願いします。 現在、レーザー弾を h ttp://l.huu.cc/img/26.png この画像を使って表示しています。 表示した結果は以下の通りです。 h ttp://l.huu.cc/img/ryujin_ques.png レーザーを表示するとギザギザになってしまうのです。 画像の右側に左の特定の部分を拡大したものを表示してあります。 このようにギザギザにならず、うまくアンチエイリアスする方法は無いでしょうか? つまり 左のような棒を1度回転させると右のようになってしまうという感じです。 ■    ■ ■    ■ ■    ■ ■     ■ ■     ■ ■     ■ ■     ■ 表示は SetDrawBlendMode( DX_BLENDMODE_ADD, 220+GetRand(35)) を行った後 DrawRotaGraphF 関数で表示しています。 アドバイス頂けると幸いです。 よろしくお願いします。

Page: 1 |

Re: 画像のギザギザを滑らかにしたい ( No.1 )
名前:furipa 日時:2008/06/17 05:37

とりあえずゲームは見た目重視で動きゃいいと思う人です 銀行システムとかと違って人が死ぬことはないわけですし 何にも技術的なことには触れてません… 描画モードをバイリニア法にしてしまって いい感じに見えるなら何もしなくていいから素敵ですがどうでしょう 等倍じゃ単にボケるだけということであれば 元画像を小さくしておいてバイリニアで拡大するとか それでも見た目or速度的にNGということなら 256のcosテーブルでしょうし、256角度分回転した ”いい感じ”の画像を用意するのが力技で手っ取り早いです 実際は4分の1角度分用意して反転すればいいと思いますが 反転しまくれば8分の1角度分でも16分の1角度でもいけますね って、1度って書かれてるって事は360で処理してるんですか とはいえ、反転使えば結局2の階乗になるから同じですな さらに人間の目には1度も2度も大して変わらなく見えると思いますので レーザー画像の角度を間引く手もあります 具体的には-5.6度〜5.6度なら0度の画像を使う 11.2度〜16.8度なら14度の画像を使うって感じです (画像を64方向とした場合  画像はいい感じなやつを64枚用意しておけばok  (上記方法で減らせますが)) ガレッガとかそんな感じじゃないですかね この辺り(割る角度とか)を見た目(レーザーの動きと角度)で組み合わせて調整すれば ゲーム的にはどうにかできるんじゃないでしょうか 多少メモリ食ってもPCですし レーザーが曲がるとなるとまた別のお話...
Re: 画像のギザギザを滑らかにしたい ( No.2 )
名前:やそ 日時:2008/06/17 09:28

「画像を滑らかにしたい」 ゲーム開発を目指すモノが1段階上を目指すとき必ずその欲求に駆られますよね。 せっかくPCの性能が高いんだから、「ファミコン画」とはおさらばしたい(笑) 私はお肌のギザギザも何とかしたいわ〜。 ゴホン、ゴホン。 本題にはいりませう。 直線描画のアルゴリズムで「Bresenhamアルゴリズム」というのがありました。 ttp://dencha.ojaru.jp/programs_07/pg_graphic_07.html ご参考になればよいのですが^^
Re: 画像のギザギザを滑らかにしたい ( No.3 )
名前:dixq 日時:2008/06/17 12:25

>>furipa様 ご回答ありがとうございます。 おぉ、力ワザでそんな方法が^^; しかしただでさえ使用メモリが多いので、 何とか画像の使用メモリを何とか減らしたいことと、 色んな弾があるので、それ全部に64種類の角度を 持った弾を書くことが出来ない事、 斜め45度にすると、画像の使用面積はかなり大きくなってしまい、 その状態で1000個とかαブレンドで描画すると、 処理落ちしてしまうことを考えると難しいかもしれません・・。 またレーザーが曲がるわけではないですが、回転することもあるので、 キレイに回転して見えないかもしれません・・。 うーん、、、でも解決方法の一つではありますね。 ありがとうございました! >>やそさん 他で色々と気を使ってはいるんですが、この描画でやすっぽく見えてしまうんですよね; 私も最近PCに向かいすぎでピントフリーズになりました・・。 お互い体には気を使いましょうw 参考サイトご紹介ありがとうございます。拝見しました。 ただこれをどうDXライブラリに適当したらいいのでしょう^^; 一つ一つピクセルを自分で表示できたらいいのですが・・。 αブレンドした画像を少し左右にずらして表示することも考えたのですが、 そうすると3倍描画しないといけないので 重くなりますし・・。 うーん・・・。
Re: 画像のギザギザを滑らかにしたい ( No.4 )
名前:Euris 日時:2008/06/17 16:55

SetDrawMode( DX_DRAWMODE_BILINEAR ) ; を設定していますか? また、画像はDrawPolygon3Dを使うと、テクスチャフィルタリング(線形補間)がかかり、なおかつ高速に描画されます。 DrawGraphやDrawRotaGraphFをDrawPolygon3Dで実行するオリジナルの関数を作ると、 かなりのパフォーマンス向上が見込めます。
Re: 画像のギザギザを滑らかにしたい ( No.5 )
名前:dixq 日時:2008/06/18 01:54

>SetDrawMode( DX_DRAWMODE_BILINEAR ) ; >を設定していますか? う・・・、リファレンスは何度も見たはずなのに、見落としていました・・?>< ありがとうございます! この関数は一秒間に何十回も呼んでも大丈夫でしょうか? レーザーのみ有効にしようとすると、1フレームでかなりの回数切り替えないといけないことに 成ると思いますので・・。 また、3Dの関数を使ったほうが高速だとは知りませんでした! >DrawGraphやDrawRotaGraphFをDrawPolygon3Dで実行するオリジナルの関数を作ると、 >かなりのパフォーマンス向上が見込めます。 これは期待できますね!! 情報ありがとうございます! DrawRotaGraphFなどは便利な関数ゆえに何か無駄な処理が含まれているのでしょうか? あとDrawPolygon3DでZを0にすればDrawRotaGraphFで表示したのと同じことになるのでしょうか? 少し小さく見える気がするのですが・・。
Re: 画像のギザギザを滑らかにしたい ( No.6 )
名前:Euris 日時:2008/06/19 15:27

SetDrawMode( DX_DRAWMODE_BILINEAR ) ; は、はじめに1回設定するだけです。 GPUはこの処理に最適化されているので速度面でのデメリットはありません。 DrawGraphやDrawRotaGraphFなどの描画関数は、結局内部でDrawPolygon3Dに似た処理を使っています。 そのため、高速化、機能拡張の余地があります。 DrawPolygon3Dを活用した関数の例を紹介します。 void Draw2D( int image, float x, float y, float w, float h, unsigned char a) { VERTEX_3D vertex[6]; float Y = 600.0f; // 縦の解像度 vertex[1].pos.x=vertex[3].pos.x=vertex[5].pos.x=((vertex[0].pos.x=vertex[2].pos.x=vertex[4].pos.x=x)+w); vertex[2].pos.y=vertex[3].pos.y=vertex[4].pos.y=((vertex[0].pos.y=vertex[1].pos.y=vertex[5].pos.y=Y-y)-h); vertex[0].pos.z=vertex[1].pos.z=vertex[2].pos.z=vertex[3].pos.z=vertex[4].pos.z=vertex[5].pos.z=0.f; vertex[0].u=vertex[2].u=vertex[4].u=0.f; vertex[1].u=vertex[3].u=vertex[5].u=1.f; vertex[0].v=vertex[1].v=vertex[5].v=0.f; vertex[2].v=vertex[3].v=vertex[4].v=1.f; vertex[0].r=vertex[1].r=vertex[2].r=vertex[3].r=vertex[4].r=vertex[5].r=0xff; vertex[0].g=vertex[1].g=vertex[2].g=vertex[3].g=vertex[4].g=vertex[5].g=0xff; vertex[0].b=vertex[1].b=vertex[2].b=vertex[3].b=vertex[4].b=vertex[5].b=0xff; vertex[0].a=vertex[1].a=vertex[2].a=vertex[3].a=vertex[4].a=vertex[5].a=a; DrawPolygon3D(vertex,2,image,TRUE); } 画像のサイズと透過度を指定できる高速な2D描画関数です。 x,yが位置座標、w,hが横と縦の大きさ, aが透過度(0は完全に透過、255が透過なし)です。 ただし、±1ドットほどの精度、画像のシャープさ、処理の冗長性を犠牲にする場合があります。 >少し小さく見える気がするのですが・・。 スクリーンショットをとって確認してみてください。
Re: 画像のギザギザを滑らかにしたい ( No.7 )
名前:dixq 日時:2008/06/20 03:39

ご回答ありがとうございます。 >SetDrawMode( DX_DRAWMODE_BILINEAR ) ; >は、はじめに1回設定するだけです。 ぼやけてしまう場合もあるということなので、 レーザーのみこの設定でいこうと思ったのですが、 使うなら全部これにしてしまった方がいいんでしょうか? >DrawPolygon3Dを活用した関数の例を紹介します。 これはとても参考になります! ありがとうございます。 さっそく使ってみます。
Re: 画像のギザギザを滑らかにしたい ( No.8 )
名前:dixq 日時:2008/06/20 03:59

早速試してみました。 レーザーが想像以上にキレイになったので驚きました。 ・・が一方、画像の継ぎ目が目立つようになってしまいました。 h ttp://kissho.xii.jp/1/src/1jyou38719.png.html DLKey : 1111 設定ピクセルを1ピクセル単位で動かしてみても、 ぴったり継ぎ目が無くなる位置がみあたりません。 この関数を使うとこのような継ぎ目が目立ってしまうのでしょうか?
Re: 画像のギザギザを滑らかにしたい ( No.9 )
名前:Euris 日時:2008/06/20 22:26

>使うなら全部これにしてしまった方がいいんでしょうか? レンダリング設定を頻繁に変更することは処理効率において少し不利ですが、ほとんど影響はありません。 どちらでも大丈夫です。 >この関数を使うとこのような継ぎ目が目立ってしまうのでしょうか? この件について、残念ながら「根本的な」解決法はありません。 手っ取り早い方法は、境界が目立つところでは 以前のように SetDrawMode( DX_DRAWMODE_NEAREST ) ; に戻すことでしょう。 ですが、工夫しだいで境界を「目立たせなくする」ことは可能です。 こういうところがプログラマー、グラフィッカーとしての腕の見せ所です。 グラフィックスの(終わりのない)追求にチャレンジしていきましょう! 以下のページに参考画像をおいておきます。 ttp://www.siv3d.googlepages.com/dxl
Re: 画像のギザギザを滑らかにしたい ( No.10 )
名前:Dixq 日時:2008/06/21 05:09

ご回答頂きありがとう御座います。 参考リンクもありがとうございます。 一応床以外の背景とレーザーだけ SetDrawMode( DX_DRAWMODE_BILINEAR ) ; で描画し、後は通常描画するようにしました。 何度もこの関数を呼ぶのはよくないのかなと思いましたが、 今のところ処理落ちなどの問題もなさそうです。 とりあえずレーザーを滑らかにする件はこれで解決できそうです。 大変お世話になりました!

Page: 1 |