直接X背景图像
DirectX background image
我试图按照我的3D directx书中的教程进行一些修改。我遇到的问题是我想画一个图像,但无法让它工作。该示例是使用相机,因为它基于一个小游戏,但我只想加载图像而无需任何花哨的相机转换。(按原样绘制图像,无需调整大小 + alpha 混合)。
这是我的代码,应该包含相关部分。
.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; } }
调用函数"Begin"时,你应该使用D3DXSPRITE_ALPHABLEND而不是D3DXSPRITE_DONOTMODIFY_RENDERSTATE,指定D3DXSPRITE_ALPHABLEND并不意味着
你必须使用alpha blend,如果你不调用Screen::onResetDevice(),alpha blend将不起作用,所以这里D3DXSPRITE_ALPHABLEND只是一个参数,使"开始"工作。 如果你不想在调用函数"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
相关文章:
- 在 Visual C++ 中以编程方式更改按钮的背景图像
- 如何设置与其背景图像大小相对应的窗口大小?
- 同一图像中的反转文本和背景颜色
- 如何在QT中设置样式表以选择假发背景的随机图像
- 具有SPI_SETDESKWALLPAPER功能的程序仅在尝试使用C++将其更改为图像时将桌面背景更改为黑色
- 无法将图像保存在具有白色背景的JPG中 OpenCV
- QDialog - 设置背景图像
- 在 qlabel 中将图像设置为背景并在其顶部设置文本
- 为背景图像设置比例
- 将图像设置为Drawingarea的背景
- 为qlineedit设置了背景图像时,如何在qlineedit中设置文本颜色
- 打开不同的图像文件,并使用GDI 库在主应用程序窗口的背景上绘制它们
- 如何让 WNDCLASS 将位图图像作为背景
- 直接X背景图像
- 在 MFC 窗口中使用 PNG 作为背景图像
- 有没有一种算法可以使用opencv来分离图像的前景和背景
- 在屏幕上绘制图像后背景发生变化
- QPushButton的Qt背景图像
- 黑色背景,图像在中心使用 GDI
- 使用C++/OpenCV或Matlab将图像的白色背景替换为透明背景