two15 2024-06-18 16:01 采纳率: 0%
浏览 5

Direct12光线追踪问题

运行到 swapChain1->Present(1, 0);时出现以下错误
0x00007FFEFDFBBA99 处(位于 1.exe 中)引发的异常: Microsoft C++ 异常: _com_error,位于内存位置 0x00000077953DBF50 处。
0x00007FFEFDFBBA99 处(位于 1.exe 中)引发的异常: Microsoft C++ 异常: _com_error,位于内存位置 0x00000077953DC2C8 处。
0x00007FFEFDFBBA99 处(位于 1.exe 中)引发的异常: Microsoft C++ 异常: _com_error,位于内存位置 0x00000077953DD070 处。
0x00007FFEFDFBBA99 处(位于 1.exe 中)引发的异常: Microsoft C++ 异常: std::bad_alloc,位于内存位置 0x00000077962FCCC8 处。
1.h代码如下

#pragma once
#define WIN32_LEAN_AND_MEAN
#include<Windows.h>

#include<wrl.h>
using namespace Microsoft::WRL;

#include<DirectXMath.h>
using namespace DirectX;

#include<d3d12.h>
#pragma comment(lib,"d3d12.lib")
#include<dxgidebug.h>
#pragma comment(lib,"dxguid.lib")
#include<dxgi1_6.h>
#pragma comment(lib,"dxgi.lib")
#include<d3dcompiler.h>
#pragma comment(lib, "d3dcompiler.lib")

#include"x64\\Debug\\1.hlsl.h"

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-18 16:01
    关注

    引自免费微信小程序:皆我百晓生

    遇到在调用 swapChain1->Present(1, 0); 时出现 _com_errorstd::bad_alloc 异常的情况,通常意味着 DirectX 对象在创建、配置或资源分配上存在问题。下面是一些排查和解决这类问题的步骤和建议:

    1. 检查 SwapChain 创建和配置

    确保 SwapChain 的创建参数正确无误。例如,如果使用的是 Direct3D 12,则需要检查 DXGI_SWAP_CHAIN_DESC1 结构体中的设置是否合理,尤其是 BufferCountWidthHeightFormat 字段。

    2. 资源管理

    • 检查内存分配std::bad_alloc 异常通常表明内存分配失败。确保在创建 DirectX 对象(如缓冲区、纹理、着色器等)时有足够的系统资源。
    • 释放不再使用的资源:确保所有不再使用的 DirectX 资源都被适当地释放,以避免内存泄漏和资源冲突。

    3. Debugging DirectX

    使用 DirectX 的调试层可以提供更详细的错误信息。在你的代码中加入以下行:

    ComPtr<ID3D12Debug> debugController;
    if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)))) {
        debugController->EnableDebugLayer();
    }
    

    然后重新编译并运行你的程序,这样可以在出现错误时得到更具体的诊断信息。

    4. 检查 DirectX 版本兼容性

    确认你的 DirectX 版本与硬件驱动和操作系统兼容。在某些情况下,更新显卡驱动或 DirectX 运行库可能解决问题。

    5. 代码示例

    下面是一个创建 SwapChain 的简化示例,用于参考:

    ComPtr<IDXGIFactory4> factory;
    ComPtr<IDXGISwapChain1> swapChain;
    
    // 创建工厂
    ThrowIfFailed(CreateDXGIFactory2(0, IID_PPV_ARGS(&factory)));
    
    // 获取适配器信息
    ComPtr<IDXGIAdapter1> adapter;
    ThrowIfFailed(factory->EnumWarpAdapter(IID_PPV_ARGS(&adapter)));
    
    // 设置 SwapChain 描述
    DXGI_SWAP_CHAIN_DESC1 swapDesc = {};
    swapDesc.Width = 800;
    swapDesc.Height = 600;
    swapDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    swapDesc.BufferCount = 2; // 双缓冲
    swapDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
    swapDesc.SampleDesc.Count = 1;
    
    // 创建 SwapChain
    ThrowIfFailed(factory->CreateSwapChainForHwnd(
        commandQueue.Get(), hWnd, &swapDesc,
        nullptr, nullptr, &swapChain));
    

    注意上述代码中的 commandQueuehWnd 应当是预先定义好的 Direct3D 12 命令队列和窗口句柄。

    6. 使用 Visual Studio 的调试工具

    利用 Visual Studio 的调试功能,逐步执行代码,观察在抛出异常前后的变量状态和对象引用。这有助于定位问题的具体原因。

    以上步骤应该能帮助你诊断并解决在使用 Direct3D 12 光线追踪和图形渲染时遇到的问题。如果问题仍然存在,考虑查阅 DirectX 官方文档或寻求社区支持。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月18日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见