【问题标题】:Deformed texture when using sprites (Directx 9)使用精灵时变形的纹理 (Directx 9)
【发布时间】:2013-08-24 11:04:24
【问题描述】:

我正在使用 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);

}

【问题讨论】:

  • Camera->GetX() 是否返回浮点值?如果将它们截断为 int 会发生什么?

标签: c++ directx textures sprite directx-9


【解决方案1】:

“变形纹理”是什么意思还不太清楚。 我看到的是第二张照片是模糊的第一张。并且左上角也有黑色边框。

模糊。

模糊可能是由于

    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 个像素 =)

2 纹理的幂。

我已经读到在 Directx 8 和更新版本中所有纹理都必须是倍数 2,但这不是我的情况,因为图像是 32x32。

这是错误的(大部分)。现在,您可以(并且会想要)使用任何大小的纹理。它仅取决于硬件功能。但是在这里,你不太可能在 2013 年找到非 pow2-texture 设备。

假设您有很大的纹理,例如 800x800。将其调整为 1024x1024 将是巨大的硬盘空间、系统内存和 GPU 内存浪费。

如果您仍然怀疑自己是否拥有支持 pow-2 的设备,请使用 GetDeviceCaps 并检查标志 D3DPTEXTURECAPS_POW2

还有点抱怨。

从您的代码中那些奇怪的旧东西开始,DirectX 8 很常见,而 DirectX 9 是高端的。 2013 年会有更多的机会。可能,您会想要退出(并烧掉)您当前的指南或书籍,并选择更新鲜的东西,例如 DirectX 11(不是 10)并感受力量。或者,至少是最新的 DirectX 9,而不是古老的。

祝你好运,编码愉快! =)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多