直接 X "Texture cannot be null"异常

Exception "Texture cannot be null" Direct X

本文关键字:null 异常 be Texture 直接 cannot      更新时间:2023-10-16

我正在使用directx11和directxtk编码2D游戏。

我做了一个类框架,该框架初始化了为游戏显示的窗口和初始化Directx。这些初始化正常工作。然后,我决定在窗口中绘制一些背景等,但是过了一段时间后,它出于例外而退出。我尝试了一个尝试{...} catch(){}块,它告诉我"纹理不能无效"。但是,我找不到它在谈论哪种纹理,即使通过删除和检查所有值。

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

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

draw(dword& elapsedtime)方法调用dabbackground()和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);
}

通过调试,我几乎可以确定该异常来自缺点()和drawcharacter()。的确,当我在抽奖方法中评论这些问题时,我没有错误,但是一旦我提出了几秒钟内显示我想要的东西,就会设定例外。

这是方法缩写()例如:

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

因此,一旦我删除此方法(或任何遵循相同步骤的drawcharcter()),窗口会显示我期望的几秒钟,但随后我得到了例外的"纹理不能为null"。我还注意到,方法drawcharacter()让窗口显示我想要的内容比方法缩写()(),其纹理比角色的纹理大。

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

您会注意到我在此代码中做错了什么?为什么在显示一段时间时会将纹理视为null?我一直在寻找答案,已经有几个小时了,请提供一些帮助!谢谢

我注意到您创建了两个新的ID3D11shaderResourceView,而无需释放旧的ITERITION。您可以尝试仅创建ShaderResourceViews一次,然后将它们存储为全局变量,也可以在Sprites-> draw(...)调用之后尝试 -> Release()它们。