1

3D directx book のチュートリアルにいくつかの変更を加えて従おうとしました。私が遭遇した問題は、画像を描画したいのですが、これを機能させることができないということです。この例は小さなゲームに基づいているため、カメラを使用していますが、派手なカメラ変換なしで画像をロードしたいだけです。(リサイズ+アルファブレンディングせずにそのまま描画)。

これは、関連する部分を含める必要がある私のコードです。

.h

class Screen
{
private:
    IDirect3DTexture9* m_BGImage;
    ID3DXSprite* m_Sprite;

    IDirect3DDevice9* m_Device;

public:
    Screen();
    ~Screen();

    void setDevice(IDirect3DDevice9* device);  
    void setBGImage(std::string path);

    void Draw();
    void onLostDevice();
    void onResetDevice();

    void Clean();
};

.cpp

Screen::Screen() {}

Screen::~Screen()
{
    Clean();
}

void Screen::setDevice(IDirect3DDevice9* device) 
{
    m_Device = device;
    D3DXCreateSprite(m_Device, &m_Sprite);
}

void Screen::setBGImage(std::string path)
{
    D3DXCreateTextureFromFileA(m_Device, path.c_str(), &m_BGImage);
}

void Screen::Draw()
{
    m_Sprite->Begin(D3DXSPRITE_DONOTMODIFY_RENDERSTATE); // This is (so I believe) what causes the problem. If I use D3DXSPRITE_OBJECTSPACE|D3DXSPRITE_DONOTMODIFY_RENDERSTATE like described in the example from my book I only get a black screen.

    m_Sprite->Draw(m_BGImage, 0, &D3DXVECTOR3(256.0f, 256.0f, 0.0f), 0, D3DCOLOR_XRGB(255, 255, 255));
    m_Sprite->Flush();

    m_Sprite->End();
}

void Screen::Clean()
{
    ReleaseCOM(m_Sprite);
    ReleaseCOM(m_BGImage);
}

void Screen::onLostDevice()
{
    m_Sprite->OnLostDevice();
}

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

    m_Device->SetRenderState(D3DRS_ALPHAREF, 10);
    m_Device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);

    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);

    m_Device->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
}

編集:ほとんど忘れていました:

#define ReleaseCOM(x) { if(x){ x->Release(); x = 0; } }
4

1 に答える 1

0

関数「Begin」を呼び出すときは、D3DXSPRITE_DONOTMODIFY_RENDERSTATE の代わりに D3DXSPRITE_ALPHABLEND を使用する必要があります。D3DXSPRITE_ALPHABLEND を指定しても、アルファ ブレンドを使用する必要があるわけではありません。Screen::onResetDevice() を呼び出さない場合、アルファ ブレンドは機能しません。 「開始」を機能させるためのパラメーターだけです。関数「Begin」を呼び出すときにフラグを指定したくない場合は、0 を渡すことができます。

 m_Sprite->Begin(0); 
 m_Sprite->Draw(m_BGImage, 0, &D3DXVECTOR3(256.0f, 256.0f, 0.0f), 0, D3DCOLOR_XRGB(255, 255, 255));
 m_Sprite->Flush();
 m_Sprite->End();

参照: http://msdn.microsoft.com/en-us/library/windows/desktop/bb205466(v=vs.85).aspx

于 2012-10-11T03:25:47.407 に答える