例外“纹理不能为空”Direct X.

时间:2017-12-29 21:01:11

标签: c++ exception null directx textures

我使用DirectX11和DirectXTK编写2D游戏。

我做了一个类框架,它初始化了游戏显示的窗口并初始化了DirectX。这些初始化工作正常。然后,我决定在窗口中绘制一些背景等,但过了一会儿,它会在异常时退出。我做了一个try {...} catch(){}块,告诉我“纹理不能为空”。但是,我无法找到它正在讨论的纹理,即使通过调试和检查所有值。

我决定将我在窗口中绘制的不同元素分开,看看问题可能来自哪里......所以现在我有3种绘制方法:

Draw(DWORD &elapsedTime);
DrawBackground(DWORD &elapsedTime);
DrawCharacter(DWORD &elapsedTime);

Draw(DWORD& elapsedTime)方法调用DrawBackground()和DrawCharacter()方法。

这是我的绘画方法:

void Framework::Draw(DWORD * elapsedTime)
{
    // Clearing the Back Buffer
    immediateContext->ClearRenderTargetView(renderTargetView, Colors::Aquamarine);

    //Clearing the depth buffer to max depth (1.0)
    immediateContext->ClearDepthStencilView(depthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0); //immediateContext is a ID3D11DeviceContext*

    CommonStates states(d3dDevice); //d3dDevice is a ID3D11Device*

    sprites.reset(new SpriteBatch(immediateContext));


    sprites->Begin(SpriteSortMode_Deferred, states.NonPremultiplied());

    DrawBackground1(elapsedTime);
    DrawCharacter(elapsedTime);

    sprites->End();


    //Presenting the back buffer to the front buffer
    swapChain->Present(0, 0);
}

通过调试我几乎可以肯定异常来自DrawBackground()和DrawCharacter()。实际上,当我在Draw方法中评论那些时,我没有错误,但是只要我放了一个它就会在几秒钟后显示我想要的内容之后设置异常。

这是方法DrawBackground(),例如:

void Framework::DrawBackground1(DWORD * elpasedTime)
{
    RECT *try1 = new RECT();
    try1->bottom = 0; try1->left = 0; try1->right = (int)WIDTH; try1->bottom = (int)HEIGHT;


    ID3D11ShaderResourceView * texture2 = nullptr;
    ID3D11ShaderResourceView * textureRV = nullptr;

    CreateDDSTextureFromFile(d3dDevice, L"../Images/backgrounds/set2_background.dds", nullptr, &textureRV);
    CreateDDSTextureFromFile(d3dDevice, L"../Images/backgrounds/set3_tiles.dds", nullptr, &texture2);

    sprites->Draw(textureRV, XMFLOAT2(0, 0), try1, Colors::White);
    sprites->Draw(texture2, XMFLOAT2(0, 0), try1, Colors::CornflowerBlue);
}

因此,只要我取消注释此方法(或任何遵循相同步骤的DrawCharacter()),窗口就会显示我所期望的几秒钟,但之后我得到异常“纹理不能为空” 。我还注意到DrawCharacter()方法允许窗口显示我想要的方法比DrawBackground()方法更长,其纹理大于字符的方法。

我不确定这些信息是否有用,但我认为这可能与纹理的大小有关?

你会注意到我在这段代码中做错了吗?为什么纹理在显示一段时间后会被视为null?我一直在寻找几个小时的答案,一些帮助会很棒! 谢谢

1 个答案:

答案 0 :(得分:2)

我注意到你在每次迭代时都创建了两个新的ID3D11ShaderResourceView而没有发布旧版本。你可以尝试只创建一次ShaderResourceViews并将它们存储为全局变量,或者你可以在sprites-> Draw(...)调用之后尝试使用 - > Release()它们。