DirectXで頂点情報を回転させた際のテクスチャについて

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

DirectXで頂点情報を回転させた際のテクスチャについて

#1

投稿記事 by miya » 15年前

あけましておめでとうございます。

現在、DirectX9を用いて2Dのゲームを制作しているのですが、
描画の際に少し困っているので、こちらで質問させて頂きます。

現在、XYZRHWの情報を持った構造体(トランスフォーム済みの頂点フォーマット?)を使い、
DrawPrimitiveUPする際に第一引数にD3DPT_TRIANGLELISTとしているので、6頂点の情報を持った
4角形ポリゴンにテクスチャを貼り付けて描画しています。

このポリゴンの頂点情報を三角関数を利用し回転させた後、テクスチャを貼り付けると
綺麗に表示されず、ジャギーのようなものが発生してしまう事で悩んでいます。
(□のような物が書かれたテクスチャを回転させたポリゴンに貼り付け◇のようにすると
斜めの部分がギザギザになってしまう)
また、このジャギの影響で背景のような大きなものを徐々にゆっくりと回転させていった際には、
テクスチャの画像が波打ったように描画されてしまい気持ちの悪い状態となってしまいます。

テクスチャを少しだけぼかすなどして、この目立つジャギーを少しでも目立たなくしたいと思った
のですが、方法が分からず困っています。

どうかよろしくお願いします。

Justy

Re:DirectXで頂点情報を回転させた際のテクスチャについて

#2

投稿記事 by Justy » 15年前


> 方法が分からず困っています

 ポリゴンエッジとテクスチャパターン両方のエイリアシングが出てるということでしょうか。
 サンプラーステートは最近点サンプリング (D3DTEXF_POINT)ではないですよね?

 GIMPや Photoshopなどのグラフィックソフトを使って、イメージに軽くぼかしを入れれば
それなりに緩和されると思います。

 って、ひょっとしてそのやり方がわからないとかでしょうか?


 あと、エッジの方はマルチサンプリングを試してみてはどうでしょうか?

DVDM

Re:DirectXで頂点情報を回転させた際のテクスチャについて

#3

投稿記事 by DVDM » 15年前

>>miyaさん
画像がぼやけてしまう現象は私も以前起こったので、その時の対応を書いておきます。

[対応1]
テクスチャを読み込むときに以前はD3DXCreateTextureFromFile関数を使用していたのですが
D3DXCreateTextureFromFileEx関数に変更したら直りました。


[対応2]
MSDNライブラリに、以下のような記述があります。
[color=red size=3>
Direct3D では、次の計算を実行して、浮動小数点テクスチャ座標をテクセル アドレスにマッピングする。
Tx = (u*Mx) - 0.5
Ty = (v*Mx) - 0.5


[/color]

要するに、描画するポリゴンの座標を0.5引いておきましょうということです。
例えば、幅100、高さ100、XY座標を(0, 0)の位置に描画したいなら
頂点はそれぞれ、(-0.5, -0.5), (99.5, -0.5), (-0.5, 99.5), (99.5, 99.5)となります。

詳しくはこちらに記述されております。
http://msdn.microsoft.com/ja-jp/library/cc373047.aspx


[対応3]
レンダリングステートの、サンプラーステートを変更して、線型補完にしてみる

pDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
pDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
pDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);

(pDeviceは LPDIRECT3DDEVICE9型です)

一応、私はこのような対応で直りました。

miya

Re:DirectXで頂点情報を回転させた際のテクスチャについて

#4

投稿記事 by miya » 15年前

> DVDM様

サンプラーステートについて調べて、テストしている間の事で見落としてしまいました。すいません。
詳細にご教授頂きありがとうございます。

miya

Re:DirectXで頂点情報を回転させた際のテクスチャについて

#5

投稿記事 by miya » 15年前

コメントが投稿されたと思ったらプレビュー画面でした…。編集パスも設定忘れてしました…。
コメントが前後してしまいますが、投稿されているはずだったコメントを記載しておきます。

> サンプラーステートは最近点サンプリング (D3DTEXF_POINT)ではないですよね?

自分の勉強不足でした…。
「サンプラーステート」と言われるまで、SetSamplerStateメソッドがあり、
テクスチャフィルタをかけられる、ということに事態に気づいていませんでした。
下記のようにした結果、問題を解決することが出来ました。

g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );

DirectXに慣れるのには、まだまだ時間が掛かりそうです。
とは言え今回の件でまたひとつ、出来ることが増えたように感じます。
教えていただきありがとうございました。

閉鎖

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