スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Direct3Dのテクスチャフィルタリング

大した記事ではないですが、Direct3Dでテクスチャマッピングされたポリゴンを描画するときに用いるフィルタ(補間手法)について忘備録を兼ねてちょっとだけ。

2Dのコンテンツを作るにしても3Dのコンテンツを作るにしても、画像をくるくる回したり、拡大縮小して表示する機会はきっとたくさんあるはず。ガチガチの3Dで描画するならまだしも、例えばノベルゲームのように絵の綺麗さや演出がウェイトを占めているようなコンテンツだと、綺麗に描画できないと死活問題になりかねないと思います。
なぜ今更こんな記事を書いたかというと、実は私自身がこれで随分悩んだからです。探したページが悪かったのか、キーワードが悪かったのか、はたまた参考書が悪かったのか運が悪かったのか……。

さて、本題。
フィルタリングといっても、ごく普通にDirect3Dのインタフェースとデバイスを初期化して描画に取り掛かるだけなのですが、デバイスにサンプリングステートをセットしてやるのを忘れるとラスタライズされた結果は以下の図のようになります。
いかにもニアレストネイバーっぽいジャギジャギ具合です。
等倍かつ回転無しの場合はPixeltoPixelできれいに表示されていますが、それ以外の場合は使えません。
これを直すためのコードはとても簡単で、SetSamplerStateというデバイスメソッドで下のように対応するステージとフィルタにフィルタリングモードを渡してやるだけ。列挙型によると、ちゃんと異方性フィルタリングなど色々な手法が準備されているようですが、完全な2Dなら平行投影なので拡大縮小ともにバイリニアで十分でしょう。もちろんシェーダでも記述できます。
// ホスト側でかくとこんなかんじ
pD3DDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
pD3DDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);

// シェーダ側でかくとこんなかんじ
sampler_state
{
MinFilter=LINEAR;
MagFilter=LINEAR;
};
というわけで、バイリニアで上の画像を描画したものが左図です。
ちゃんと拡大・回転したものはあらまほしい描画になっていることがわかります。ただ、当然ながら等倍の画像に対してもバイリニアでフィルタリングするので、微妙にボケが生じます。であるから、等倍表示の時はフィルタを切っておくのが無難だと思います。縮小したものについてはモアレが生じていますが、これはそうなってもしようがない元画像なので気にしません。ポリゴンにはアンチエイリアスがかからないので、袿の部分だけジャギーが出ているのも見て取れます。
結論。
2Dで何か作る&きれいに表示したいときは、動的に画像を弄るのではなくてできるだけ静的な画像を用意する。ヌルヌル動く回転などは……まあ、仕方がない。

以下、余談。
このメソッド、プログラマブルシェーダに手を付けるまで恥ずかしながら私は存在を知りませんでした。既に書きましたが、それのおかげでサンプリング手法をどのフラグで弄れるのかなど無駄に悩んだ感があります。2Dでゲームを作っている手前、ノベルゲームではないにしろきれいな補間はぜひ欲しいところです。
これにまつわるうれしいような悲しいようなニヤニヤしちゃうような四方山話が一つあって、ある市販のノベルゲームをやった時、キャラクタが主人公ににじり寄ってくる(立ち絵が拡大される)演出がありました。で、サンプラがちゃんと設定されていなかったらしく、キャラ絵が見事にドット絵と化したわけです。
今なら解決の手段を知っているし、これぐらいならテストプレイの時に潰せるでしょう。ですが、やっぱり開発者として知らないということは恐ろしいなと感じてゾゾーッとした一瞬でした。

コメントの投稿

非公開コメント

sidetitlePROFILEsidetitle
AUTHOR: かいのしずく


詳しい自己紹介ページ
本棚(ブクログ)
平成20年以降にチェックしたのすべての本
本棚(読書メーター)
各月の読了ページ数管理用
チームカチューシャ
同人ゲームサークル MATRICES

sidetitleINFORMATIONsidetitle
VISITORS
CALENDAR
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
SEARCH
RECENT ENTRIES
CATEGORIES
ARCHIVES
sidetitleLINKsidetitle
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。