1

私はdirectxを初めて使用し、最終的に背景画像/テクスチャとして表示したい画像をロードすることができました

イメージの定義

void setBGImage(std::string path)
{
    D3DXCreateTextureFromFileA(m_Device, path.c_str(), &m_BGImage);
    m_BGImageCenter = D3DXVECTOR3(450.0f, 250.0f, 0.0f); // Image is 900x500
}

描画イメージ

void DrawBackground()
{
    m_Sprite->Begin(D3DXSPRITE_OBJECTSPACE|D3DXSPRITE_DONOTMODIFY_RENDERSTATE);

    // Texture tiling
    /*
    D3DXMATRIX texScaling;
    D3DXMatrixScaling(&texScaling, 1.0f, 1.0f, 0.0f);
    m_Device->SetTransform(D3DTS_TEXTURE0, &texScaling);*/

    //D3DXMATRIX T, S, R;
    //D3DXMatrixTranslation(&T, 0.0f, 0.0f, 0.0f);
    //D3DXMatrixScaling(&S, 1.0f, 1.0f, 0.0f);
    //D3DXMatrixRotationZ(&R, 0.45f);
    //m_Sprite->SetTransform(&(S*T));


    m_Sprite->Draw(m_BGImage, 0, &m_BGImageCenter, 0, D3DCOLOR_XRGB(255, 255, 255));
    m_Sprite->Flush();

    m_Sprite->End();
}

onResetDevice (起動時に呼び出されます)

void onResetDevice()
{
    m_Sprite->OnResetDevice();

    // Sets up the camera 640 units back looking at the origin.
    D3DXMATRIX V;
    D3DXVECTOR3 pos(0.0f, 0.0f, -640.0f); // This distance is just a test value to get only the image and no white background/border as soon as I have it centered I will adjust it.
    D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
    D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
    D3DXMatrixLookAtLH(&V, &pos, &target, &up);
    m_Device->SetTransform(D3DTS_VIEW, &V);

    // The following code defines the volume of space the camera sees.
    D3DXMATRIX P;
    RECT R;
    GetClientRect(m_hWnd, &R);
    float width  = (float)R.right;
    float height = (float)R.bottom;
    D3DXMatrixPerspectiveFovLH(&P, D3DX_PI*0.25f, width/height, 0.0f, 1.0f);
    m_Device->SetTransform(D3DTS_PROJECTION, &P);

    // This code sets texture filters, which helps to smooth out disortions when you scale a texture.
    m_Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    m_Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    m_Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

    // This line of code disables Direct3D lighting.
    m_Device->SetRenderState(D3DRS_LIGHTING, false);

    // The following code specifies an alpha test and reference value.
    m_Device->SetRenderState(D3DRS_ALPHAREF, 10);
    m_Device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);

    // The following code is used to setup alpha blending.
    m_Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
    m_Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
    m_Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    m_Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    // Indicates that we are using 2D texture coordinates.
    m_Device->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
}

これらの方法を使用して背景画像をレンダリングすると、中央に配置されず(少し右寄り)、上下逆さまに表示され、高さと幅の比率が正しくないと感じました(画像は少しぼやけていて、画像は本来あるべきほど高くありません)。

ここに画像の説明を入力

私は何を試しましたか?

画像を反対側から見てから回転させるために、さまざまな座標を調整しようとしましたが、何を試しても白/存在しない背景になりました。

画像を中央に配置することはそれほど大したことではありません。カメラの位置を移動するだけm_BGImageCenterで済みますが、Draw メソッドでそれを行うことになっていて、100% 正しく動作しないように思われるため、混乱しています。

私の質問 (このコンテキストで複数の質問をしても問題ないと思います):

画像を上下逆にしないようにするにはどうすればよいですか(理論的にはどうすればよいかはわかっていますが、どういうわけか正しくないので、座標を教えてください)。

画像が中央にないのはなぜですか?

D3DXMatrixPerspectiveFovLH少しぼやけて見えるので、私のイメージをラップしている可能性はありますか?

4

0 に答える 0