あけましておめでとうございます。
現在、DirectX9を用いて2Dのゲームを制作しているのですが、
描画の際に少し困っているので、こちらで質問させて頂きます。
現在、XYZRHWの情報を持った構造体(トランスフォーム済みの頂点フォーマット?)を使い、
DrawPrimitiveUPする際に第一引数にD3DPT_TRIANGLELISTとしているので、6頂点の情報を持った
4角形ポリゴンにテクスチャを貼り付けて描画しています。
このポリゴンの頂点情報を三角関数を利用し回転させた後、テクスチャを貼り付けると
綺麗に表示されず、ジャギーのようなものが発生してしまう事で悩んでいます。
(□のような物が書かれたテクスチャを回転させたポリゴンに貼り付け◇のようにすると
斜めの部分がギザギザになってしまう)
また、このジャギの影響で背景のような大きなものを徐々にゆっくりと回転させていった際には、
テクスチャの画像が波打ったように描画されてしまい気持ちの悪い状態となってしまいます。
テクスチャを少しだけぼかすなどして、この目立つジャギーを少しでも目立たなくしたいと思った
のですが、方法が分からず困っています。
どうかよろしくお願いします。
DirectXで頂点情報を回転させた際のテクスチャについて
Re:DirectXで頂点情報を回転させた際のテクスチャについて
> 方法が分からず困っています
ポリゴンエッジとテクスチャパターン両方のエイリアシングが出てるということでしょうか。
サンプラーステートは最近点サンプリング (D3DTEXF_POINT)ではないですよね?
GIMPや Photoshopなどのグラフィックソフトを使って、イメージに軽くぼかしを入れれば
それなりに緩和されると思います。
って、ひょっとしてそのやり方がわからないとかでしょうか?
あと、エッジの方はマルチサンプリングを試してみてはどうでしょうか?
Re:DirectXで頂点情報を回転させた際のテクスチャについて
>>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型です)
一応、私はこのような対応で直りました。
画像がぼやけてしまう現象は私も以前起こったので、その時の対応を書いておきます。
[対応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型です)
一応、私はこのような対応で直りました。
Re:DirectXで頂点情報を回転させた際のテクスチャについて
> DVDM様
サンプラーステートについて調べて、テストしている間の事で見落としてしまいました。すいません。
詳細にご教授頂きありがとうございます。
サンプラーステートについて調べて、テストしている間の事で見落としてしまいました。すいません。
詳細にご教授頂きありがとうございます。
Re:DirectXで頂点情報を回転させた際のテクスチャについて
コメントが投稿されたと思ったらプレビュー画面でした…。編集パスも設定忘れてしました…。
コメントが前後してしまいますが、投稿されているはずだったコメントを記載しておきます。
> サンプラーステートは最近点サンプリング (D3DTEXF_POINT)ではないですよね?
自分の勉強不足でした…。
「サンプラーステート」と言われるまで、SetSamplerStateメソッドがあり、
テクスチャフィルタをかけられる、ということに事態に気づいていませんでした。
下記のようにした結果、問題を解決することが出来ました。
g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
DirectXに慣れるのには、まだまだ時間が掛かりそうです。
とは言え今回の件でまたひとつ、出来ることが増えたように感じます。
教えていただきありがとうございました。
コメントが前後してしまいますが、投稿されているはずだったコメントを記載しておきます。
> サンプラーステートは最近点サンプリング (D3DTEXF_POINT)ではないですよね?
自分の勉強不足でした…。
「サンプラーステート」と言われるまで、SetSamplerStateメソッドがあり、
テクスチャフィルタをかけられる、ということに事態に気づいていませんでした。
下記のようにした結果、問題を解決することが出来ました。
g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
DirectXに慣れるのには、まだまだ時間が掛かりそうです。
とは言え今回の件でまたひとつ、出来ることが増えたように感じます。
教えていただきありがとうございました。