构造类后 C++/CLI DirectX11 指针已删除/垃圾收集

问题描述

我正在尝试让 DirectX11 正常工作……除非我离开 DX11 类的构造函数

我有一些指向 DX11 对象的指针,当我使用 Clear 或 Present 函数时这些指针都消失了。

DX11.h

#pragma once

#include <dxgi.h>
#include <d3dcommon.h>
#include <d3d11.h>
#include <d3d10.h>
#include <directxmath.h>

#include "../GraphicsSettings.h"

class DX11
{
public:
    DX11(GraphicsSettings settings,HWND hwnd);

    int errorcode = 0;

    void Clear(float red,float green,float blue,float alpha);
    void Present();
private:
    IdxgiSwapChain* swapchain;
    ID3D11Device* device;
    ID3D11DeviceContext* context;
    ID3D11RasterizerState* rasterstate;

    ID3D11Texture2D* backbuffer;
    ID3D11Texture2D* depthbuffer;
    ID3D11rendertargetView* rendertargetview;
    ID3D11Depthstencilstate* depthstencilstate;
    ID3D11DepthStencilView* depthstencilview;
};

DX11.cpp

#include "DX11.h"

DX11::DX11(GraphicsSettings settings,HWND hwnd)
{
    dxgi_MODE_DESC mdesc = {};
    ZeroMemory(&mdesc,sizeof(mdesc));
    mdesc.Width = settings.Width;
    mdesc.Height = settings.Height;
    mdesc.Format = dxgi_FORMAT::dxgi_FORMAT_R8G8B8A8_UnorM;
    dxgi_SWAP_CHAIN_DESC scdesc = {};
    ZeroMemory(&scdesc,sizeof(scdesc));
    scdesc.BufferCount = 2;
    scdesc.BufferDesc = mdesc;
    scdesc.BufferUsage = dxgi_USAGE_RENDER_TARGET_OUTPUT;
    scdesc.Outputwindow = hwnd;
    scdesc.SwapEffect = dxgi_SWAP_EFFECT_FLIP_disCARD;
    scdesc.Windowed = settings.Windowed;
    scdesc.Flags = 0;
    scdesc.SampleDesc.Count = 1;

    D3D_FEATURE_LEVEL fl = D3D_FEATURE_LEVEL::D3D_FEATURE_LEVEL_11_0;

    if (D3D11CreateDeviceAndSwapChain(NULL,D3D_DRIVER_TYPE::D3D_DRIVER_TYPE_HARDWARE,NULL,D3D11_CREATE_DEVICE_DEBUG,&fl,1,D3D11_SDK_VERSION,&scdesc,&swapchain,&device,&context) != 0)
    {
        errorcode = -5001;
    }

    if (swapchain->GetBuffer(0,__uuidof(ID3D11Texture2D),(LPVOID*)&backbuffer) != 0)
    {
        errorcode = -5002;
    }

    if (device->CreaterendertargetView(backbuffer,&rendertargetview) != 0)
    {
        errorcode = -5003;
    }

    D3D11_TEXTURE2D_DESC dbdesc = {};
    ZeroMemory(&dbdesc,sizeof(dbdesc));
    dbdesc.Width = settings.Width;
    dbdesc.Height = settings.Height;
    dbdesc.MipLevels = 1;
    dbdesc.ArraySize = 1;
    dbdesc.Format = dxgi_FORMAT_D24_UnorM_S8_UINT;
    dbdesc.SampleDesc.Count = 1;
    dbdesc.SampleDesc.Quality = 0;
    dbdesc.Usage = D3D11_USAGE_DEFAULT;
    dbdesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
    dbdesc.cpuAccessFlags = 0;
    dbdesc.MiscFlags = 0;
    if (device->CreateTexture2D(&dbdesc,&depthbuffer) != 0)
    {
        errorcode = -5004;
    }

    D3D11_DEPTH_STENCIL_DESC dsdesc = {};
    ZeroMemory(&dsdesc,sizeof(dsdesc));
    dsdesc.DepthEnable = true;
    dsdesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
    dsdesc.DepthFunc = D3D11_COMPARISON_LESS;
    dsdesc.StencilEnable = true;
    dsdesc.StencilReadMask = 0xFF;
    dsdesc.StencilWriteMask = 0xFF;
    dsdesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
    dsdesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
    dsdesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
    dsdesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
    dsdesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
    dsdesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
    dsdesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
    dsdesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
    if (device->CreateDepthstencilstate(&dsdesc,&depthstencilstate) != 0)
    {
        errorcode = -5005;
    }
    context->OMSetDepthstencilstate(depthstencilstate,1);

    D3D11_DEPTH_STENCIL_VIEW_DESC dsvdesc = {};
    ZeroMemory(&dsvdesc,sizeof(dsvdesc));
    dsvdesc.Format = dxgi_FORMAT_D24_UnorM_S8_UINT;
    dsvdesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
    dsvdesc.Texture2D.MipSlice = 0;
    if (device->CreateDepthStencilView(depthbuffer,&dsvdesc,&depthstencilview) != 0)
    {
        errorcode = -5006;
    }

    context->OMSetrendertargets(1,&rendertargetview,depthstencilview);

    D3D11_RASTERIZER_DESC rdesc = {};
    rdesc.AntialiasedLineEnable = true;
    rdesc.CullMode = D3D11_CULL_BACK;
    rdesc.DepthBias = 0;
    rdesc.DepthBiasClamp = 0.0f;
    rdesc.DepthClipEnable = true;
    rdesc.FillMode = D3D11_FILL_SOLID;
    rdesc.FrontCounterClockwise = false;
    rdesc.MultisampleEnable = false;
    rdesc.ScissorEnable = false;
    rdesc.SlopeScaledDepthBias = 0.0f;
    if (device->CreaterasterizerState(&rdesc,&rasterstate) != 0)
    {
        errorcode = -5007;
    }

    context->RSSetState(rasterstate);

    D3D11_VIEWPORT viewport = {};
    viewport.Width = (float)settings.Width;
    viewport.Height = (float)settings.Height;
    viewport.MinDepth = 0.0f;
    viewport.MaxDepth = 1.0f;
    viewport.TopLeftX = 0.0f;
    viewport.TopLeftY = 0.0f;

    context->RSSetViewports(1,&viewport);

    float fieldOfView = (float)3.1415f / 4.0f;
    float screenAspect = (float)settings.Width / (float)settings.Height;

    DirectX::XMMATRIX projection;
    DirectX::XMMATRIX world;

    DirectX::XMMatrixPerspectiveFovLH(fieldOfView,screenAspect,0.01f,100.0f);
    world = DirectX::XMMatrixIdentity();
}

void DX11::Clear(float red,float alpha)
{
    float color[4];
    color[0] = red;
    color[1] = green;
    color[2] = blue;
    color[3] = alpha;

    context->OMGetrendertargets(1,&depthstencilview);

    context->ClearrendertargetView(rendertargetview,color);
    context->ClearDepthStencilView(depthstencilview,D3D11_CLEAR_DEPTH,1.0f,0);
}

void DX11::Present()
{
    swapchain->Present(0,0);
}

在 DX11 构造函数中,变量被赋值: https://i.stack.imgur.com/d3zyM.png

离开构造函数后,我的变量消失了: https://i.stack.imgur.com/3GkcV.png

我已经受够了,因为我已经搜索了 3 个小时,并尝试了 1 个小时用我自己的想法来修复它

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)