我正在使用ID3DXSprite制作一个简单的2D平铺游戏。当我设法绘制图像时,我注意到它与我编辑时的质量不同。我已经在Directx 8中看到了更新的所有纹理必须是2的倍数,但这不是我的情况,因为图像是32x32。
原始图片:link
渲染图片:link
初始化代码:
bool D3DEngine::InitD3D(HWND hwnd)
{
D3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS D3DPP;
ZeroMemory(&D3DPP, sizeof(D3DPP));
D3DPP.Windowed = true;
D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
D3DPP.hDeviceWindow = hwnd;
D3DPP.BackBufferFormat = D3DFMT_A8R8G8B8;
D3DPP.BackBufferWidth = 300;
D3DPP.BackBufferHeight = 300;
D3DPP.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
if (D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_MIXED_VERTEXPROCESSING, &D3DPP, &D3DDevice) != D3D_OK)
{
return false;
}
else
{
D3DXCreateTextureFromFile(D3DDevice, ".bmp", &Texture);
D3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
D3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
Sprite = new D3DSprite(D3DDevice);
Camera = new Camera2D(0, 0, ScreenPosX, ScreenPosY, 1.0f, 0.0f);
Debug->Output("Started DirectX");
return true;
}
}
呈现代码:
void D3DSprite::DrawTexture(LPDIRECT3DTEXTURE9 Texture, CONST RECT* Rect, ScreenPos Pos, D3DCOLOR Color)
{
D3DXVECTOR3 Center(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 Position(Pos.x - Camera->GetX(), Pos.y - Camera->GetY(), 0.0f);
Handle->Draw(Texture, Rect, &Center, &Position, Color);
}
struct ScreenPos
{
float x;
float y;
};
class D3DSprite
{
public:
LPD3DXSPRITE Handle;
D3DSprite(LPDIRECT3DDEVICE9 Device);
~D3DSprite();
void DrawTexture(LPDIRECT3DTEXTURE9 Texture, CONST RECT* Rect, ScreenPos Pos, D3DCOLOR Color);
void DrawTexture(LPDIRECT3DTEXTURE9 Texture, CONST RECT* Rect, WorldPos Pos, D3DCOLOR Color);
void Begin(DWORD Flags) { Handle->Begin(Flags); };
void End() { Handle->End(); };
};
void D3DEngine::Render()
{
D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_COLORVALUE(0.0f, 0.0f, 0.0, 1.0f), 1.0f, 0);
D3DDevice->BeginScene();
ScreenPos Position = {0, 0};
Sprite->Begin(D3DXSPRITE_OBJECTSPACE | D3DXSPRITE_ALPHABLEND);
Sprite->DrawTexture(Texture, NULL, Position, D3DCOLOR_COLORVALUE(1.0f, 1.0f, 1.0f, 1.0f));
Sprite->End();
D3DDevice->EndScene();
D3DDevice->Present(NULL, NULL, NULL, NULL);
}
答案 0 :(得分:2)
目前尚不清楚“变形纹理”是什么意思。 我看到的是第二张照片是模糊的第一张照片。左边和顶部也有黑色边框。
模糊可能由
引起 D3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
D3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
当绘制简单的精灵(如平铺地图)时,您可能想要禁用mipmapping。因此,请尝试注释掉这一行,或使用D3DTEXF_NONE
作为第三个参数。
另一个奇怪的事情是设备创建时D3DCREATE_MIXED_VERTEXPROCESSING
标志。不太确定它是否会导致模糊,但最常见的是设置D3DCREATE_HARDWARE_VERTEXPROCESSING
。在2013年,您不太可能找到任何无法在硬件中呈现DirectX 9的基于Windows的设备。
截至黑色边框,我不知道。希望你在裁剪截图时错过了1个像素=)
我已经在Directx 8中看到了它,并且所有纹理都必须是倍数 2,但这不是我的情况,因为图像是32x32。
这是错误的(大多数情况下)。在今天,您可以(并希望)使用任何大小的纹理。它只取决于硬件功能。但在这里,你不太可能在2013年找到非pow2纹理设备。
想象一下,你有很大的纹理,比如800x800。将其大小调整为1024x1024将是巨大的硬盘空间,系统内存和GPU内存浪费。
如果您仍然怀疑是否拥有支持pow-2的设备,请使用GetDeviceCaps
并检查标记D3DPTEXTURECAPS_POW2
。
多一点抱怨。
对于代码中那些奇怪的旧事,从DirectX 8常见且DirectX 9是高端的时候开始。在2013年有它的地方。也许,你可能想要退出(并烧掉)你当前的指南或书籍并拿起更新鲜的东西,比如DirectX 11(不是10)并感受到力量。或者,至少是最新的DirectX 9,而不是古代的。
祝你好运,编码愉快! =)