如何解决构造类后 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 举报,一经查实,本站将立刻删除。