ページ 1 / 1
DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 00:00
by bonbo
早速ですが質問させていただきます
DirectXを使ったアンチエイリアシングの強度について(現在ビルボードを用いて描画しています)
設定したいのですがいったいどこで設定しているのでしょうか。
コード無しで申し訳ないのですが、よろしくお願いします。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 00:05
by bonbo
環境を書き忘れていました…すみません…
環境は
SDK 2010June
Windows7
です。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 10:51
by bonbo
おそらくデバイス作成時に決定されるのだと思うのですが…
コード:
D3DPRESENT_PARAMETERS d3dpp;
HRESULT hr;
if ( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ){
MessageBox( hWnd , (LPCTSTR)"Can't create Direct3D." , (LPCTSTR)"Error" , MB_OK );
return FALSE;
}
ZeroMemory( &d3dpp , sizeof( d3dpp ) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE; /*ここがアンチエイリアスを決めるらしい*/
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
hr = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , hWnd ,
D3DCREATE_SOFTWARE_VERTEXPROCESSING ,
&d3dpp , &g_pd3dDevice );
MultiSampleTypeにD3DMULTISAMPLE_NONEを設定しても変わらないのは何か別に原因があるのでしょうか…
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 11:18
by softya(ソフト屋)
そこはハードウェア依存の部分なので、まず動作中のビデオカードが何処までアンチエイリアスをサポートしているか調べてから設定します。
「その1 初期化なんて怖くないぜ!」
http://marupeke296.com/DXG_Init.html
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 12:39
by bonbo
>soft屋さん
ありがとうございます
>動作中のビデオカードが何処までアンチエイリアスをサポートしているか調べてから設定します。
すみません…調べたのですが、メソッドの引数に何を設定していいのかよくわからずじまいでした…
一応書いたコードが
コード:
D3DPRESENT_PARAMETERS d3dpp;
LPDIRECT3D9 g_pD3D = NULL;//グローバル
d3dpp.BackBufferCount = 1;
d3dpp.Windowed = TRUE;
d3dpp.BackBufferWidth = 640;
d3dpp.BackBufferHeight = 480;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
int test=g_pD3D->CheckDeviceMultiSampleType(
D3DADAPTER_DEFAULT ,
D3DDEVTYPE_HAL,
d3dpp.BackBufferFormat,
d3dpp.Windowed,
D3DMULTISAMPLE_3_SAMPLES,
NULL )
/*分からなかったので既存の設定
g_pD3D->CreateDevice( D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , hWnd ,
D3DCREATE_SOFTWARE_VERTEXPROCESSING ,
&d3dpp , &g_pd3dDevice );
を見て適当に設定しています
*/
TCHAR lps[256];
wsprintf(lps,_T("%d"),hr);
MessageBox(hWnd,lps,_T("test"),MB_OK);
まあ当たり前ですが不定値の負の値(失敗)がかえってきました…
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 12:48
by softya(ソフト屋)
ただ負の値などではなく、どのエラーかを明確に調べないと意味が無いです。
D3DERR_INVALIDCALL とD3DERR_NOTAVAILABLEとD3DERR_INVALIDDEVICE では意味が違います。
「CheckDeviceMultiSampleType メソッド (IDirect3D9)」
http://msdn.microsoft.com/ja-jp/library/cc324292.aspx
それとDirecXSDKに付いているDirectXSampleBrowserで探せるAntiAliasサンプルは見たのでしょうか?
DXUTだったので生DirecXとは違うかも知れません。
【補足】
いろんなパターンでCheckDeviceMultiSampleTypeして合格の組み合わせを探すしか無いと思います。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 13:15
by bonbo
>ただ負の値などではなく、どのエラーかを明確に調べないと意味が無いです。
返ってきたのはD3DERR_NOTAVAILABLEでした
つまりこのパソコンの能力が足りないということでしょうか…一応現在、アンチエイリアスは機能している状態です(画像がぼやけている)
>DirecXSDKに付いているDirectXSampleBrowserで探せるAntiAliasサンプルは見たのでしょうか?
もちろん見ました。…といいたいのですが…June2010サンプルをビルドしたところinstalled DirectX is out of date といわれてしまい
August2009の方を試したらヘッダが足りないといわれ、結局後回しにしていました…すみません…
今August2009のAntiAlias_2008を実行できましたが、コードがすこぶる長いのでどこを参考にすればよいのか分かりません。
甘えかもしれないですが、どこにヒントがあるのかだけ教えていただけないでしょうか
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 13:26
by bonbo
>いろんなパターンでCheckDeviceMultiSampleTypeして合格の組み合わせを探すしか無いと思います。
なにかテンプレートみたいなものはないですか…まさかDirectXプログラマの人は皆そうやっているわけじゃないですよね…そう思いたいのですが
>DXUTだったので生DirecXとは違うかも知れません。
そうなのですか…
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 14:22
by bonbo
今、ウィンドウを最大化してみたところ、拡大された画像がぼやけていませんでした。
ちょっと探っていきたいと思います。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 14:32
by softya(ソフト屋)
私も詳しくないですがCheckDeviceMultiSampleTypeでパラメータの組み合わせパターンのループを実行するしか無いと思います。
あとDirectXSampleBrowserのサンプルのプロジェクトを作れなくても実行ファイルがあるので、それでアンチエリアスを試せませんか? そうすればご自分のハードの限界は分かると思います。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 14:52
by bonbo
>CheckDeviceMultiSampleTypeのループ
D3D_OK(S_OK)が帰ってくればよいということですよね。試してみます。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 16:54
by ISLe
やりたいことは画面がボケないようにしたい(アンチエイリアスの無効化)ということですか?
とりあえず、
プログラムで設定している解像度と表示方法(ウィンドウかフルスクリーンかとか)
使用しているビデオカードの種類(メーカーやチップの型番)とドライバのバージョン
を教えていただけますか。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 18:44
by bonbo
>ISLeさん
ありがとうございます
返信が遅れて申し訳ありません。
はい。アンチエイリアスを無効化したいのです。
以下現在のデバイス作成のコードです
コード:
LPDIRECT3D9 g_pD3D;//グローバル
コード:
BOOL InitDirect3D( HWND hWnd )//デバイスの初期化処理
{
D3DDISPLAYMODE dmode;
D3DPRESENT_PARAMETERS d3dpp;
HRESULT hr;
if ( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ){
MessageBox( hWnd , (LPCTSTR)"Can't create Direct3D." , (LPCTSTR)"Error" , MB_OK );
return FALSE;
}
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dmode);
ZeroMemory( &d3dpp , sizeof( d3dpp ) );
d3dpp.Windowed = TRUE; // ウィンドウ・モード
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = dmode.Format; // デスクトップのフォーマットを使用
d3dpp.BackBufferCount = 1; // ダブルバッファリングを行う
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 16Bit Zバッファ作成
hr = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , hWnd ,
D3DCREATE_SOFTWARE_VERTEXPROCESSING ,
&d3dpp , &g_pd3dDevice );
if ( FAILED( hr ) ){
MessageBox( hWnd , (LPCTSTR)"Can't create device." , (LPCTSTR)"Error0001" , MB_OK );
return FALSE;
}
// テクスチャの設定
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
// 半透明処理を行う
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
if ( FAILED( hr ) ){
MessageBox( hWnd , (LPCTSTR)"Can't create device." , (LPCTSTR)"Error0002" , MB_OK );
return FALSE;
}
D3DXCreateSprite( g_pd3dDevice , &g_pSprite );
for(int i=0;i<SPRITE_MAX;i++)//SPRITE_MAX==5000
D3DXCreateSprite( g_pd3dDevice , &g_Sprite[i] );
}
上記のとおりですがウィンドウモード、解像度は設定してないです。
ビデオカードは
Intel(R) HG Graphics
です
ドライバは
ドライバーモデルというところに
WDDM 1.1
と書かれていたのですが、あっているでしょうか
間違った回答があればすみません。
よろしくお願いします。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 19:27
by ISLe
ドライバモデルはウィンドウズの規格なので関係無いです。
とりあえずビデオカードは置いときましょう。
ウィンドウモードならクライアント領域のサイズを教えていただきたいのですが。
テクスチャのフィルタはどうなっていますか?
テクスチャを画面サイズの4倍以上の解像度にすれば、コードはそのままでも、ボケの程度が気にならないレベルになると思いますが。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 20:36
by bonbo
返信が遅くなり申し訳ありません
クライアント領域は480(h),640(w)です
また、現在テクスチャ作成にはD3DCreateTextureFromFile()関数を使用しており
コード:
D3DXCreateTextureFromFileExA(
g_pd3dDevice, // select your d3ddevice
File_Name,
0,
0,
0,
0,
D3DFMT_A1R5G5B5, // You can transparaentize color
D3DPOOL_MANAGED,
D3DX_FILTER_LINEAR,
D3DX_FILTER_LINEAR,
D3DCOLOR_ARGB(255, 0, 0,0), // Transparentizing brack color
NULL,
NULL,
&GRF_Name->TextureNeme // Texture name
);
となっております
ミップマップについてあまり調べていなかったため、第3~6引数は0となっています
フィルタはD3DX_FILTER_LINEARですが、D3DX_FILTER_POINT、D3DX_FILTER_TRIANGLEを使っても変わりませんでした。
>解像度を4倍以上にする
つまり、第五引数のミップレベルを480*640*4に設定すればよいということでしょうか
一応実行してみましたが、やはりぼやけてしまいます。
引数の組み合わせが間違っているのでしょうか
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 20:41
by bonbo
蛇足かもしれないのですが、画像の表示にはスプライトを用いています(これしか知らないのですが)。
スプライトにテクスチャを貼りつけたものをスプライトごと拡大しています。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 22:26
by bonbo
解決策とは全く関係ないんですが
上記のInitDirect3Dでバックバッファの幅を拡縮すると画像サイズが変わりますね(画面サイズですけど)。
…もう少しな気がするんだけどなあ…
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 22:52
by ISLe
ミップマップが有効だと画面解像度より低い解像度のテクスチャが選択される可能性がありますし、そもそもスプライト機能にミップマップは必要ないと思います。
ちなみにスプライトとビルボードはまったく異なるものです。
4倍の解像度というのは、640x480の画面いっぱいに貼るテクスチのサイズは1280x960が必要だという意味です。
この調子だと何度もやり取りすることになるので、スプライト一枚描画する完全なコードを提示していただくことはできないでしょうか。
使用しているテクスチャ画像も必要です。
(追記)
ぴったりのページを見付けました。
http://www5b.biglobe.ne.jp/~u-hei/d3d2d/mission8.html
ここに書かれている内容と同じ対処を行なってください。
このページのコードでは元々ミップマップテクスチャを用意していない(ミップマップレベルが1)ので改造に含まれていませんが、その点も合わせてください。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 23:35
by bonbo
>この調子だと何度もやり取りすることになるので、スプライト一枚描画する完全なコードを提示していただくことはできないでしょうか。
>使用しているテクスチャ画像も必要です。
わかりました。夜遅くまでご迷惑をおかけしました。
http://www1.axfc.net/uploader/so/2683984
アップロードしました
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 23:51
by bonbo
>ぴったりのページを見付けました。
ありがとうございます。
ただ、そのページの
D3DTSS_MIPFILTER、D3DTSS_MAGFILTER、D3DTSS_MINFILTER
ですが、今はもうサポートさてれいないではないでしょうか(いくら検索してもリファレンスが出てきません。)
勘違いだったらすみません
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月20日(火) 23:52
by softya(ソフト屋)
アンチエリアスでやりたいことを逆に勘違いしてましたね(^^;
ISLeさんが詳しいのでお任せします。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月21日(水) 00:02
by bonbo
msdnのD3DTEXTURESTAGESTATETYPE 列挙型にも含まれていませんでした
どうやら8.1→9への移行時に廃止されたようです。
代わりにD3DSAMP_MINFILTER
などがありました。はやとちりしてすみませんでした
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月21日(水) 00:13
by ISLe
bonbo さんが書きました:代わりにD3DSAMP_MINFILTER
などがありました。はやとちりしてすみませんでした
見付けたページの情報が古かったですね。
Direct3D9では、IDirect3DDevice9::SetSamplerStateで設定するようですが、MSDNの説明によるとこちらはデフォルト設定のようです。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月21日(水) 10:56
by bonbo
改造を施しましたが
コード:
//テクスチャの作成(あちらはリソースからであった)
hr= D3DXCreateTextureFromFileEx(
g_pd3dDevice, // select your d3ddevice
File_Name,
0,
0,
1,
0,
D3DFMT_A1R5G5B5, // You can transparaentize color
D3DPOOL_MANAGED,
D3DX_FILTER_NONE,
D3DX_FILTER_NONE,
D3DCOLOR_ARGB(255, 0, 0,0), // Transparentizing brack color
&srcImgInfo,
NULL,
&GRF_Name->TextureNeme // Texture name
);
g_fTexImageWidth = 1.0f;
g_fTexImageHeight = 1.0f;
if (GRF_Name->TextureNeme){
if (S_OK == GRF_Name->TextureNeme->GetLevelDesc(0,&d3dsDesc)){
tw = srcImgInfo.Width;
th = srcImgInfo.Height;
g_fTexImageWidth = (float)tw;
g_fTexImageWidth /= (float)d3dsDesc.Width;
g_fTexImageHeight = (float)th;
g_fTexImageHeight /= (float)d3dsDesc.Height;
}
}
コード:
D3DDISPLAYMODE dmode;
D3DPRESENT_PARAMETERS d3dpp;
HRESULT hr;
if ( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ){
MessageBox( hWnd , (LPCTSTR)"Can't create Direct3D." , (LPCTSTR)"Error" , MB_OK );
return FALSE;
}
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dmode);
ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));
d3dpp.BackBufferCount = 1;
d3dpp.Windowed = TRUE;
d3dpp.BackBufferWidth = 320;
d3dpp.BackBufferHeight = 240;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
int tt=g_pD3D->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL,
d3dpp.BackBufferFormat,
d3dpp.Windowed, D3DMULTISAMPLE_3_SAMPLES, NULL );
TestMessage(tt);
hr = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , hWnd ,
D3DCREATE_SOFTWARE_VERTEXPROCESSING ,
&d3dpp , &g_pd3dDevice );
if ( FAILED( hr ) ){
MessageBox( hWnd , (LPCTSTR)"Can't create device." , (LPCTSTR)"Error0001" , MB_OK );
return FALSE;
}
// テクスチャの設定
g_pd3dDevice->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, FALSE );
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
g_pd3dDevice->SetTextureStageState( 0,(D3DTEXTURESTAGESTATETYPE)D3DSAMP_MIPFILTER,D3DTEXF_NONE );
g_pd3dDevice->SetTextureStageState( 0,(D3DTEXTURESTAGESTATETYPE)D3DSAMP_MAGFILTER,D3DTEXF_NONE );
g_pd3dDevice->SetTextureStageState( 0,(D3DTEXTURESTAGESTATETYPE)D3DSAMP_MINFILTER,D3DTEXF_NONE );
適当に組み込んだだけなので変化はありませんでした
コードのダウンロードはしていただけたでしょうか。恥ずかしいので早めに消したいのですが。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月21日(水) 11:04
by bonbo
部分的に取り組んでも無理だと思うので
とりあえずあちらのサイトのやり方で試していきます。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月21日(水) 16:42
by ISLe
バックバッファのサイズが320x240に変化しているのはなぜですか?
あちこち同時に弄ると原因の特定が難しくなりますが。
そしてこちらは状況の変化が分からないので適切な回答ができません。
D3DSAMP_*はIDirect3DDevice9::SetSamplerStateで設定してください。
ムチャをすると最悪ビデオチップが壊れますよ。
デフォルト設定なので、ステートを変更してなければ省略できますし。
クライアント領域のサイズは640x480だとおっしゃいましたよね。
と思ってアップロードされたソースコードを見たらウィンドウのサイズ指定がめちゃくちゃなんですが。
クライアント領域のサイズって自動調整されましたっけ。
Direct3D9デバイスのアンチエイリアス設定は、バックバッファのレンダリングに対するもので、デバイス画面に対しては、グラフィックドライバが勝手にフィルタをかけます。
ボケないようにするためには、ピクセルが1対1で対応するようにバックバッファのサイズを設定しなければいけませんが。
あとボケとは関係無いと思いますが、テクスチャのフォーマット指定を16ビットでロードしているのは意図したものでしょうか。
bonbo さんが書きました:コードのダウンロードはしていただけたでしょうか。恥ずかしいので早めに消したいのですが。
ここは個別相談室ではなく公開掲示板なので、後の参考になるように残しておいて欲しいですが。
それに大元は他のサイトからコピペしたサンプルコードではないのでしょうか。
ほとんど同じコードを見ましたが。
しかし、既に参考にならないくらいに改変されてしまったようなので消してしまって構わないでしょう。
回答が得られないのはbonboさんの不利益なだけですから。
bonbo さんが書きました:部分的に取り組んでも無理だと思うので
とりあえずあちらのサイトのやり方で試していきます。
そうですね。
小出しの情報に対してこちらが指摘している箇所以外にどんどん不具合を増やしているようですから、まとまった情報を元に一から進めたほうが良いかもしれません。
アップロードしてもらったソースコードも投稿に書かれていることと中身が一致しない部分がたくさんありますし。
ただし、期待どおりに動いても、どうしてそれで良いのかbonboさんが理解できるかどうかは別だと思うので同じことを繰り返す可能性は少なくない気がします。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月21日(水) 17:41
by ISLe
後からこのスレを見た方の参考になるように、いわゆるスプライト(平面ポリゴン)がボケないようにするための注意点を列挙しておきます。
- バックバッファはデバイス画面(モニタ画面)のピクセルと1対1で対応するようにサイズを決定する。
例えば640x480を超える解像度のモニタに640x480の画面モードで表示する場合はモニタの拡大処理によってボケる可能性がありますが、アプリケーションプログラムからは制御できません。
画面モードを変更せずに拡大する場合も、バックバッファ→デバイス画面間はグラフィックドライバに依存し、アプリケーションプログラムからは制御できません。
- テクスチャを生成する際には、ミップマップを無効化(ミップマップレベルに1を指定)し、フィルタを『なし』にする。
ビデオメモリにロードされるテクスチャにフィルタが掛かるのを抑制します。
画像が2の累乗サイズではないと余白が追加されることがあり、その場合テクスチャ座標の調整が必要になります。
- テクスチャサンプリングステートを最近点に設定する。
テクスチャが描画されるときにフィルタが掛かるのを抑制します。
- テクセルとピクセルのマッピング誤差に注意する。
Direct3D9まではテクスチャ座標に0.5足すか描画座標から0.5引くかしないとグラフィックドライバによってはボケることがありました。
D3DXSpriteを使う場合は関係無し。
デバイスのマルチサンプリング設定(フルシーンアンチエイリアス)は意味合いが異なるので省略。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月22日(木) 16:14
by bonbo
>ISLeさん
何度も本当にありがとうございます
安易に答えを教えていただけるなんて思っていました
甘えが過ぎますね。
フィルタリングに関してはDirectX9,10,11ともに書籍では解説がほとんどなされていませんでした。
ですので教えていただいた情報をもとになんとか解決していきます。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月22日(木) 16:22
by softya(ソフト屋)
何のために小難しいDirectXをやっているのかって事が大事でしょう。
それは、DirectXの仕組みのあちこちを理解したいからではないのでしょうか?
簡単に使いたいならDXライブラリとかがあるので、こちらを使えばゲーム制作に集中出来るわけです。
なので、そこを抜かして動くことを目指しては本末転倒なのでは?と思うわけです。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月22日(木) 16:34
by bonbo
>soft屋さん
ありがとうございます。
やる気が16倍くらいになりました。
確かにその通りです、目的を見失っていました。
…ただやっぱり動いてほしいです。頑張ります
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月22日(木) 16:38
by softya(ソフト屋)
bonbo さんが書きました:>soft屋さん
ありがとうございます。
やる気が16倍くらいになりました。
確かにその通りです、目的を見失っていました。
…ただやっぱり動いてほしいです。頑張ります
今のコードに執着せずに0から1つ1つパラメータを確かめながら組み直した方が良いと思います。
ISLeさんが押さえるポイントを書いてくれたので、そこを確かめながらじっくり組んでみましょう。
案外あっさり動くかも知れません。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月24日(土) 09:22
by bonbo
すみません、トピックを見直していて言ってなかった気がするので一応言っておくと
正常なテクスチャを表示することはできています(ぼけていない)。
そのあと拡縮処理回転(行列の積)をしたときに画像がぼけます。
いずれにしても解決しなければいけないのですが
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月24日(土) 17:39
by ISLe
bonbo さんが書きました:そのあと拡縮処理回転(行列の積)をしたときに画像がぼけます。
最も重要な情報を最後に出してきましたね。
単純にフィルタ無効&ポイントサンプリングで無事にボケなくなったとしても、拡縮率が整数倍でない拡縮や回転では逆にドットがガタガタになるのが目立つようになりますが、それはかまわないのでしょうか。
拡大縮小回転しても綺麗に見せたいのなら、最初に回答したときにさらっと触れましたが、テクスチャの解像度を倍以上(ドットを際立たせたいなら最低3倍以上)に上げて、むしろ適切にフィルタを掛ける必要があります。
Re: DirectXアンチエイリアスの設定をしたい
Posted: 2012年11月24日(土) 21:50
by bonbo
>最も重要な情報を最後に出してきましたね。
すみません…
>単純にフィルタ無効&ポイントサンプリングで無事にボケなくなったとしても、拡縮率が整数倍でない拡縮や回転では逆にドットがガタガタになるのが目立つようになりますが、それはかまわないのでしょうか。
ぼけるのが怖いので大丈夫です。
ついでに紹介していただいたサイトのフィルタの消去はできました。時間はかかってしまいましたが。
~~~~~
単刀直入にいうとできました。
スプライトを作成するのをやめて、四角形のポリゴン上(スプライトとどこが違うのかはよくわかっていないが)に
描画することにし、上記のフィルタ消去を行った後、通常の行列による拡縮をしたところ、ボケずに描画ができました。
フィルタが機能していなかったのはデバイス作成が問題だったようです。
デバイスの作成をしっかり学ばず、いきなり画像の描画まで行ったせいだと思います。
参考にさせていただいたサイトは
http://rina.jpn.ph/~rance/directx8/
http://www5b.biglobe.ne.jp/~u-hei/d3d2d/mission8.html
いずれのサイトも、DirectX9(8と9の間は描画関連の関数の変更が多いです)とは互換性が無いものがチラホラあるので、
独自で調べる必要がありましたが、とても良い経験になりました。
書籍は、以前も述べたようにフィルタに関してはあまり載っていませんでしたが、
DirectX3Dプログラミングの9,10,11(いずれも工学社)を参照しました。
ISLeさんとSoft屋さんのおかげです。
何度もありがとうございました。