DirectXアンチエイリアスの設定をしたい

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

DirectXアンチエイリアスの設定をしたい

#1

投稿記事 by bonbo » 13年前

早速ですが質問させていただきます
DirectXを使ったアンチエイリアシングの強度について(現在ビルボードを用いて描画しています)
設定したいのですがいったいどこで設定しているのでしょうか。

コード無しで申し訳ないのですが、よろしくお願いします。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#2

投稿記事 by bonbo » 13年前

環境を書き忘れていました…すみません…
環境は
SDK 2010June
Windows7
です。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#3

投稿記事 by bonbo » 13年前

おそらくデバイス作成時に決定されるのだと思うのですが…

コード:

	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を設定しても変わらないのは何か別に原因があるのでしょうか…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#4

投稿記事 by softya(ソフト屋) » 13年前

そこはハードウェア依存の部分なので、まず動作中のビデオカードが何処までアンチエイリアスをサポートしているか調べてから設定します。
「その1 初期化なんて怖くないぜ!」
http://marupeke296.com/DXG_Init.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#5

投稿記事 by bonbo » 13年前

>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);
まあ当たり前ですが不定値の負の値(失敗)がかえってきました…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#6

投稿記事 by softya(ソフト屋) » 13年前

ただ負の値などではなく、どのエラーかを明確に調べないと意味が無いです。
D3DERR_INVALIDCALL とD3DERR_NOTAVAILABLEとD3DERR_INVALIDDEVICE では意味が違います。
「CheckDeviceMultiSampleType メソッド (IDirect3D9)」
http://msdn.microsoft.com/ja-jp/library/cc324292.aspx

それとDirecXSDKに付いているDirectXSampleBrowserで探せるAntiAliasサンプルは見たのでしょうか?
DXUTだったので生DirecXとは違うかも知れません。

【補足】
いろんなパターンでCheckDeviceMultiSampleTypeして合格の組み合わせを探すしか無いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#7

投稿記事 by bonbo » 13年前

>ただ負の値などではなく、どのエラーかを明確に調べないと意味が無いです。
返ってきたのはD3DERR_NOTAVAILABLEでした
つまりこのパソコンの能力が足りないということでしょうか…一応現在、アンチエイリアスは機能している状態です(画像がぼやけている)
>DirecXSDKに付いているDirectXSampleBrowserで探せるAntiAliasサンプルは見たのでしょうか?
もちろん見ました。…といいたいのですが…June2010サンプルをビルドしたところinstalled DirectX is out of date といわれてしまい
August2009の方を試したらヘッダが足りないといわれ、結局後回しにしていました…すみません…
今August2009のAntiAlias_2008を実行できましたが、コードがすこぶる長いのでどこを参考にすればよいのか分かりません。
甘えかもしれないですが、どこにヒントがあるのかだけ教えていただけないでしょうか

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#8

投稿記事 by bonbo » 13年前

>いろんなパターンでCheckDeviceMultiSampleTypeして合格の組み合わせを探すしか無いと思います。
なにかテンプレートみたいなものはないですか…まさかDirectXプログラマの人は皆そうやっているわけじゃないですよね…そう思いたいのですが
>DXUTだったので生DirecXとは違うかも知れません。
そうなのですか…

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#9

投稿記事 by bonbo » 13年前

今、ウィンドウを最大化してみたところ、拡大された画像がぼやけていませんでした。
ちょっと探っていきたいと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#10

投稿記事 by softya(ソフト屋) » 13年前

私も詳しくないですがCheckDeviceMultiSampleTypeでパラメータの組み合わせパターンのループを実行するしか無いと思います。
あとDirectXSampleBrowserのサンプルのプロジェクトを作れなくても実行ファイルがあるので、それでアンチエリアスを試せませんか? そうすればご自分のハードの限界は分かると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#11

投稿記事 by bonbo » 13年前

>CheckDeviceMultiSampleTypeのループ
D3D_OK(S_OK)が帰ってくればよいということですよね。試してみます。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#12

投稿記事 by ISLe » 13年前

やりたいことは画面がボケないようにしたい(アンチエイリアスの無効化)ということですか?

とりあえず、
プログラムで設定している解像度と表示方法(ウィンドウかフルスクリーンかとか)
使用しているビデオカードの種類(メーカーやチップの型番)とドライバのバージョン
を教えていただけますか。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#13

投稿記事 by bonbo » 13年前

>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
と書かれていたのですが、あっているでしょうか

間違った回答があればすみません。
よろしくお願いします。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#14

投稿記事 by ISLe » 13年前

ドライバモデルはウィンドウズの規格なので関係無いです。
とりあえずビデオカードは置いときましょう。

ウィンドウモードならクライアント領域のサイズを教えていただきたいのですが。

テクスチャのフィルタはどうなっていますか?
テクスチャを画面サイズの4倍以上の解像度にすれば、コードはそのままでも、ボケの程度が気にならないレベルになると思いますが。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#15

投稿記事 by bonbo » 13年前

返信が遅くなり申し訳ありません
クライアント領域は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に設定すればよいということでしょうか
一応実行してみましたが、やはりぼやけてしまいます。
引数の組み合わせが間違っているのでしょうか

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#16

投稿記事 by bonbo » 13年前

蛇足かもしれないのですが、画像の表示にはスプライトを用いています(これしか知らないのですが)。
スプライトにテクスチャを貼りつけたものをスプライトごと拡大しています。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#17

投稿記事 by bonbo » 13年前

解決策とは全く関係ないんですが
上記のInitDirect3Dでバックバッファの幅を拡縮すると画像サイズが変わりますね(画面サイズですけど)。

…もう少しな気がするんだけどなあ…

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#18

投稿記事 by ISLe » 13年前

ミップマップが有効だと画面解像度より低い解像度のテクスチャが選択される可能性がありますし、そもそもスプライト機能にミップマップは必要ないと思います。
ちなみにスプライトとビルボードはまったく異なるものです。

4倍の解像度というのは、640x480の画面いっぱいに貼るテクスチのサイズは1280x960が必要だという意味です。

この調子だと何度もやり取りすることになるので、スプライト一枚描画する完全なコードを提示していただくことはできないでしょうか。
使用しているテクスチャ画像も必要です。

(追記)
ぴったりのページを見付けました。
http://www5b.biglobe.ne.jp/~u-hei/d3d2d/mission8.html
ここに書かれている内容と同じ対処を行なってください。
このページのコードでは元々ミップマップテクスチャを用意していない(ミップマップレベルが1)ので改造に含まれていませんが、その点も合わせてください。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#19

投稿記事 by bonbo » 13年前

>この調子だと何度もやり取りすることになるので、スプライト一枚描画する完全なコードを提示していただくことはできないでしょうか。
>使用しているテクスチャ画像も必要です。
わかりました。夜遅くまでご迷惑をおかけしました。
http://www1.axfc.net/uploader/so/2683984
アップロードしました

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#20

投稿記事 by bonbo » 13年前

>ぴったりのページを見付けました。

ありがとうございます。
ただ、そのページの
D3DTSS_MIPFILTER、D3DTSS_MAGFILTER、D3DTSS_MINFILTER
ですが、今はもうサポートさてれいないではないでしょうか(いくら検索してもリファレンスが出てきません。)
勘違いだったらすみません

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#21

投稿記事 by softya(ソフト屋) » 13年前

アンチエリアスでやりたいことを逆に勘違いしてましたね(^^;
ISLeさんが詳しいのでお任せします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#22

投稿記事 by bonbo » 13年前

msdnのD3DTEXTURESTAGESTATETYPE 列挙型にも含まれていませんでした
どうやら8.1→9への移行時に廃止されたようです。
代わりにD3DSAMP_MINFILTER
などがありました。はやとちりしてすみませんでした

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#23

投稿記事 by ISLe » 13年前

bonbo さんが書きました:代わりにD3DSAMP_MINFILTER
などがありました。はやとちりしてすみませんでした
見付けたページの情報が古かったですね。
Direct3D9では、IDirect3DDevice9::SetSamplerStateで設定するようですが、MSDNの説明によるとこちらはデフォルト設定のようです。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#24

投稿記事 by bonbo » 13年前

改造を施しましたが

コード:

//テクスチャの作成(あちらはリソースからであった)
	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 );
適当に組み込んだだけなので変化はありませんでした

コードのダウンロードはしていただけたでしょうか。恥ずかしいので早めに消したいのですが。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#25

投稿記事 by bonbo » 13年前

部分的に取り組んでも無理だと思うので
とりあえずあちらのサイトのやり方で試していきます。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#26

投稿記事 by ISLe » 13年前

バックバッファのサイズが320x240に変化しているのはなぜですか?
あちこち同時に弄ると原因の特定が難しくなりますが。
そしてこちらは状況の変化が分からないので適切な回答ができません。

D3DSAMP_*はIDirect3DDevice9::SetSamplerStateで設定してください。
ムチャをすると最悪ビデオチップが壊れますよ。
デフォルト設定なので、ステートを変更してなければ省略できますし。

クライアント領域のサイズは640x480だとおっしゃいましたよね。
と思ってアップロードされたソースコードを見たらウィンドウのサイズ指定がめちゃくちゃなんですが。
クライアント領域のサイズって自動調整されましたっけ。

Direct3D9デバイスのアンチエイリアス設定は、バックバッファのレンダリングに対するもので、デバイス画面に対しては、グラフィックドライバが勝手にフィルタをかけます。
ボケないようにするためには、ピクセルが1対1で対応するようにバックバッファのサイズを設定しなければいけませんが。

あとボケとは関係無いと思いますが、テクスチャのフォーマット指定を16ビットでロードしているのは意図したものでしょうか。

bonbo さんが書きました:コードのダウンロードはしていただけたでしょうか。恥ずかしいので早めに消したいのですが。
ここは個別相談室ではなく公開掲示板なので、後の参考になるように残しておいて欲しいですが。
それに大元は他のサイトからコピペしたサンプルコードではないのでしょうか。
ほとんど同じコードを見ましたが。
しかし、既に参考にならないくらいに改変されてしまったようなので消してしまって構わないでしょう。
回答が得られないのはbonboさんの不利益なだけですから。

bonbo さんが書きました:部分的に取り組んでも無理だと思うので
とりあえずあちらのサイトのやり方で試していきます。
そうですね。
小出しの情報に対してこちらが指摘している箇所以外にどんどん不具合を増やしているようですから、まとまった情報を元に一から進めたほうが良いかもしれません。
アップロードしてもらったソースコードも投稿に書かれていることと中身が一致しない部分がたくさんありますし。
ただし、期待どおりに動いても、どうしてそれで良いのかbonboさんが理解できるかどうかは別だと思うので同じことを繰り返す可能性は少なくない気がします。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#27

投稿記事 by ISLe » 13年前

後からこのスレを見た方の参考になるように、いわゆるスプライト(平面ポリゴン)がボケないようにするための注意点を列挙しておきます。
  • バックバッファはデバイス画面(モニタ画面)のピクセルと1対1で対応するようにサイズを決定する。
    例えば640x480を超える解像度のモニタに640x480の画面モードで表示する場合はモニタの拡大処理によってボケる可能性がありますが、アプリケーションプログラムからは制御できません。
    画面モードを変更せずに拡大する場合も、バックバッファ→デバイス画面間はグラフィックドライバに依存し、アプリケーションプログラムからは制御できません。
  • テクスチャを生成する際には、ミップマップを無効化(ミップマップレベルに1を指定)し、フィルタを『なし』にする。
    ビデオメモリにロードされるテクスチャにフィルタが掛かるのを抑制します。
    画像が2の累乗サイズではないと余白が追加されることがあり、その場合テクスチャ座標の調整が必要になります。
  • テクスチャサンプリングステートを最近点に設定する。
    テクスチャが描画されるときにフィルタが掛かるのを抑制します。
  • テクセルとピクセルのマッピング誤差に注意する。
    Direct3D9まではテクスチャ座標に0.5足すか描画座標から0.5引くかしないとグラフィックドライバによってはボケることがありました。
    D3DXSpriteを使う場合は関係無し。
デバイスのマルチサンプリング設定(フルシーンアンチエイリアス)は意味合いが異なるので省略。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#28

投稿記事 by bonbo » 13年前

>ISLeさん
何度も本当にありがとうございます
安易に答えを教えていただけるなんて思っていました
甘えが過ぎますね。
フィルタリングに関してはDirectX9,10,11ともに書籍では解説がほとんどなされていませんでした。
ですので教えていただいた情報をもとになんとか解決していきます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#29

投稿記事 by softya(ソフト屋) » 13年前

何のために小難しいDirectXをやっているのかって事が大事でしょう。
それは、DirectXの仕組みのあちこちを理解したいからではないのでしょうか?
簡単に使いたいならDXライブラリとかがあるので、こちらを使えばゲーム制作に集中出来るわけです。
なので、そこを抜かして動くことを目指しては本末転倒なのでは?と思うわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#30

投稿記事 by bonbo » 13年前

>soft屋さん
ありがとうございます。
やる気が16倍くらいになりました。
確かにその通りです、目的を見失っていました。

…ただやっぱり動いてほしいです。頑張ります

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#31

投稿記事 by softya(ソフト屋) » 13年前

bonbo さんが書きました:>soft屋さん
ありがとうございます。
やる気が16倍くらいになりました。
確かにその通りです、目的を見失っていました。

…ただやっぱり動いてほしいです。頑張ります
今のコードに執着せずに0から1つ1つパラメータを確かめながら組み直した方が良いと思います。
ISLeさんが押さえるポイントを書いてくれたので、そこを確かめながらじっくり組んでみましょう。
案外あっさり動くかも知れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#32

投稿記事 by bonbo » 13年前

すみません、トピックを見直していて言ってなかった気がするので一応言っておくと
正常なテクスチャを表示することはできています(ぼけていない)。
そのあと拡縮処理回転(行列の積)をしたときに画像がぼけます。
いずれにしても解決しなければいけないのですが

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DirectXアンチエイリアスの設定をしたい

#33

投稿記事 by ISLe » 13年前

bonbo さんが書きました:そのあと拡縮処理回転(行列の積)をしたときに画像がぼけます。
最も重要な情報を最後に出してきましたね。
単純にフィルタ無効&ポイントサンプリングで無事にボケなくなったとしても、拡縮率が整数倍でない拡縮や回転では逆にドットがガタガタになるのが目立つようになりますが、それはかまわないのでしょうか。

拡大縮小回転しても綺麗に見せたいのなら、最初に回答したときにさらっと触れましたが、テクスチャの解像度を倍以上(ドットを際立たせたいなら最低3倍以上)に上げて、むしろ適切にフィルタを掛ける必要があります。

bonbo

Re: DirectXアンチエイリアスの設定をしたい

#34

投稿記事 by bonbo » 13年前

>最も重要な情報を最後に出してきましたね。
すみません…
>単純にフィルタ無効&ポイントサンプリングで無事にボケなくなったとしても、拡縮率が整数倍でない拡縮や回転では逆にドットがガタガタになるのが目立つようになりますが、それはかまわないのでしょうか。
ぼけるのが怖いので大丈夫です。

ついでに紹介していただいたサイトのフィルタの消去はできました。時間はかかってしまいましたが。
~~~~~

単刀直入にいうとできました。

スプライトを作成するのをやめて、四角形のポリゴン上(スプライトとどこが違うのかはよくわかっていないが)に
描画することにし、上記のフィルタ消去を行った後、通常の行列による拡縮をしたところ、ボケずに描画ができました。
フィルタが機能していなかったのはデバイス作成が問題だったようです。
デバイスの作成をしっかり学ばず、いきなり画像の描画まで行ったせいだと思います。

参考にさせていただいたサイトは
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屋さんのおかげです。
何度もありがとうございました。

閉鎖

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