補遺: フィルタをキャンセル。


【ステップ1 プログラム改造】

テクスチャーがぼやける!

ビデオカードにもよると思われますが、ファイルもしくはリソースからのテクスチャ生成を行うとき、
必ずしも画像サイズと均しいサイズのテクスチャが作られるとは限りません。

画像サイズと異なるテクスチャが生成された場合、元の画像を拡大してテクスチャサイズ
と合わせるのですが、この際、テクスチャにはフィルタがかけられ、元画像が若干ぼやけてしまう場合があるようです。

元画像テクスチャ


今回はこれを避ける方法を試してみましょう。

【ステップ1−1 テクスチャ生成用フィルタの除去】
解説

ワークスペース(左図の部分)から、
d3dmain.cpp をダブルクリックして開きます。

すると画面は、図2の様になったはずです。
図1 ワークスペース


図2 d3dmain.cpp



次に、図3のようにして編集メニューから検索コマンドを選びます。

すると、図4のようなダイアログウィンドウが出てきます、

ここでは、RestoreDeviceObjects というキーワードで検索を実行。

すると画面は、リスト1aのようになったはずです。
違うようなら、「次を検索」で検索を繰り返してみて下さい。
図4 検索ウィンドウ
図3 検索コマンド


改造前

HRESULT    RestoreDeviceObjects()
{
    LPDIRECT3DSURFACE8 pBackBuffer;

    g_lpD3DDEV->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
    pBackBuffer->GetDesc( &g_d3dsdBackBuffer );
    pBackBuffer->Release();
    D3DXCreateTextureFromResourceEx(g_lpD3DDEV,
            GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1),
            0,0,1,0,
            D3DFMT_A1R5G5B5,D3DPOOL_MANAGED,
            D3DX_FILTER_LINEAR,D3DX_FILTER_LINEAR,
            D3DCOLOR_XRGB(0,255,255),        //    Color key.
            NULL,NULL,&g_pTexture);    
    HFONT    hf;
    hf = CreateFont(16,0,0,0,0,false,false,false,ANSI_CHARSET,
        OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
        DEFAULT_PITCH|FF_DONTCARE,"");
    if (hf != NULL){
        D3DXCreateFont(g_lpD3DDEV,hf,&g_pFont);
        DeleteObject(hf);
    }
    g_fTexImageWidth = 1.0f;
    g_fTexImageHeight = 1.0f;
    return    S_OK;
}
リスト1a

改造後

HRESULT    RestoreDeviceObjects()
{
    LPDIRECT3DSURFACE8    pBackBuffer;
    D3DSURFACE_DESC        d3dsDesc;
    DWORD                tw,th;
    D3DXIMAGE_INFO        srcImgInfo;
    g_lpD3DDEV->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
    pBackBuffer->GetDesc( &g_d3dsdBackBuffer );
    pBackBuffer->Release();
    D3DXCreateTextureFromResourceEx(g_lpD3DDEV,
            GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1),
            0,0,1,0,
            D3DFMT_A1R5G5B5,D3DPOOL_MANAGED,
            D3DX_FILTER_NONE,D3DX_FILTER_NONE,
            D3DCOLOR_XRGB(0,255,255),        //    Color key.
            &srcImgInfo,NULL,&g_pTexture);    
    HFONT    hf;
    hf = CreateFont(16,0,0,0,0,false,false,false,ANSI_CHARSET,
        OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
        DEFAULT_PITCH|FF_DONTCARE,"");
    if (hf != NULL){
        D3DXCreateFont(g_lpD3DDEV,hf,&g_pFont);
        DeleteObject(hf);
    }
    g_fTexImageWidth = 1.0f;
    g_fTexImageHeight = 1.0f;
    if (g_pTexture){
        if (S_OK == g_pTexture->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;
        }
    }
    return    S_OK;
}
リスト1b

解説
リスト1aをリスト1bの内容に入れ替えてください。
ここでは、元画像のサイズとテクスチャのサイズを取得して、
(元画像サイズ)÷(テクスチャサイズ)の形でテクスチャを利用します。

テクスチャに適用するフィルタをD3DX_FILTER_NONE にすることで、
テクスチャの状態は下図の様になっています。

このうち、テクスチャの読み込まれた部分のみを使用する訳です。
元画像テクスチャ


【ステップ1−2 描画用フィルタの除去】
解説

次に、図3のようにして編集メニューから検索コマンドを選びます。

すると、図4のようなダイアログウィンドウが出てきます、

ここでは、SetDefaultRenderState というキーワードで検索を実行。

すると画面は、リスト2aのようになったはずです。
違うようなら、「次を検索」で検索を繰り返してみて下さい。
図4 検索ウィンドウ
図3 検索コマンド


改造前

void    SetDefaultRenderState(LPDIRECT3DDEVICE8 lpd3ddev)
{
    lpd3ddev->SetRenderState(D3DRS_ZENABLE,FALSE);
    lpd3ddev->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
    lpd3ddev->SetRenderState(D3DRS_DITHERENABLE, TRUE );
    lpd3ddev->SetRenderState(D3DRS_BLENDOP,FALSE);
    lpd3ddev->LightEnable( 0, FALSE );
    lpd3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_COLOROP, D3DTOP_MODULATE );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_COLORARG1,D3DTA_TEXTURE );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_COLORARG2,D3DTA_DIFFUSE );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_MIPFILTER,D3DTEXF_LINEAR );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_MAGFILTER,D3DTEXF_LINEAR );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_MINFILTER,D3DTEXF_LINEAR );
}
リスト2a

改造後

void    SetDefaultRenderState(LPDIRECT3DDEVICE8 lpd3ddev)
{
    lpd3ddev->SetRenderState(D3DRS_ZENABLE,FALSE);
    lpd3ddev->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
    lpd3ddev->SetRenderState(D3DRS_DITHERENABLE, TRUE );
    lpd3ddev->SetRenderState(D3DRS_BLENDOP,FALSE);
    lpd3ddev->LightEnable( 0, FALSE );
    lpd3ddev->SetRenderState( D3DRS_LIGHTING, FALSE );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_COLOROP, D3DTOP_MODULATE );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_COLORARG1,D3DTA_TEXTURE );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_COLORARG2,D3DTA_DIFFUSE );

    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_MIPFILTER,D3DTEXF_NONE );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_MAGFILTER,D3DTEXF_NONE );
    g_lpD3DDEV->SetTextureStageState( 0,D3DTSS_MINFILTER,D3DTEXF_NONE );
}
リスト2b

解説
リスト2bの明るい部分が変更部分です。
ミップマップ用・拡大用・縮小用の3つのフィルタを
いずれも フィルタ無しに設定しています。


【ステップ2 完成】

これで画像がぼやけなくなりました。

戻る