Я пытался следовать учебнику из моей книги по 3D DirectX с некоторыми изменениями. Проблема, с которой я столкнулся, заключается в том, что я хочу нарисовать изображение, но не могу заставить это работать. Пример работает с камерой, так как он основан на небольшой игре, но я просто хочу загрузить изображение без каких-либо необычных преобразований камеры. (Нарисуйте изображение как есть без изменения размера + альфа-смешения).
Это мой код, который должен содержать соответствующие части.
.час
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; } }
Вы должны использовать D3DXSPRITE_ALPHABLEND вместо D3DXSPRITE_DONOTMODIFY_RENDERSTATE при вызове функции «Begin», указав D3DXSPRITE_ALPHABLEND, это не означает, что вы должны использовать альфа-смесь, если вы не вызываете Screen :: onResetDevice (), альфа-bleDD не будет работать; просто параметр, чтобы сделать «Begin» работает. если вы не хотите указывать какие-либо флаги при вызове функции «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
Других решений пока нет …