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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了例外“纹理不能为空”Direct X.相关的知识,希望对你有一定的参考价值。

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

我做了一个类Framework,它初始化了游戏显示的窗口并初始化了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?我一直在寻找几个小时的答案,一些帮助会很棒!谢谢

以上是关于例外“纹理不能为空”Direct X.的主要内容,如果未能解决你的问题,请参考以下文章

在 Ionic 中成功更新后,MobileFirst 8.0 Direct Update 不更新 UI

x.日期 |日期:'hh:mm' 不起作用

如何使用嵌套循环打印出X.

UIWebview loadRequest不仅适用于iPhone X.

java 9模块从A和B读取包X.

例外:从意图存储ArrayList时“无法转换为java.util.ArrayList”