Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用精灵时变形的纹理(Directx 9)_C++_Directx_Textures_Sprite_Directx 9 - Fatal编程技术网

C++ 使用精灵时变形的纹理(Directx 9)

C++ 使用精灵时变形的纹理(Directx 9),c++,directx,textures,sprite,directx-9,C++,Directx,Textures,Sprite,Directx 9,我正在使用ID3DXSprite制作一个简单的2D平铺游戏。当我设法画一幅图像时,我注意到它的质量与我编辑它时的质量不一样。我已经读到,在Directx 8和更新版本中,所有纹理都必须是2的倍数,但这不是我的情况,因为图像是32x32 原始图像: 渲染图像: 初始化代码: bool D3DEngine::InitD3D(HWND hwnd) { D3D = Direct3DCreate9(D3D_SDK_VERSION); D3DPRESENT_PARAMETERS D3

我正在使用ID3DXSprite制作一个简单的2D平铺游戏。当我设法画一幅图像时,我注意到它的质量与我编辑它时的质量不一样。我已经读到,在Directx 8和更新版本中,所有纹理都必须是2的倍数,但这不是我的情况,因为图像是32x32

原始图像:

渲染图像:

初始化代码:

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

}

不太清楚你所说的“变形纹理”是什么意思。 我看到的是第二张照片是模糊的第一张。左边和上面都有黑色的边框

模糊。 模糊可能由以下原因引起:

    D3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    D3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
在绘制简单的精灵(如平铺贴图)时,可能需要禁用。所以试着注释掉这几行,或者用作第三个参数

混合软件/硬件设备。 另一件奇怪的事情是设备创建时的
D3DCREATE\u MIXED\u VERTEXPROCESSING
标志。不太确定它是否会导致模糊,但最常见的是设置。在2013年,您不太可能找到任何基于Windows的设备无法在硬件中呈现DirectX 9

黑边。 至于黑边界,我不知道。希望您在截图时错过了1个像素=)

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

这(大部分)是错误的。在当今时代,你可以利用任何大小的纹理。它只取决于硬件能力。但在这里,你不太可能在2013年找到非pow2纹理设备

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

如果您仍然怀疑是否有pow-2功能设备,请使用并检查标志

再抱怨一点。

从DirectX 8很常见而DirectX 9很高端的时候起,您的代码中就出现了一些奇怪的老掉牙的东西。2013年,这项工作没有什么进展。也许,你会想退出(并烧掉)你目前的指南或书籍,拿起一些更新鲜的东西,比如DirectX 11(而不是10),感受一下它的力量。或者,至少是最新的DirectX 9,而不是老式的

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

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