directx12 3d开发过程中出现的报错 九

报错: ThrowIfFailed(md3dDevice->CreateGraphicsPipelineState(&basePsoDesc, IID_PPV_ARGS(&mPSO))); 参数错误

当 md3dDevice->CreateGraphicsPipelineState 调用返回 “参数错误” 时,意味着传递给该函数的 D3D12_GRAPHICS_PIPELINE_STATE_DESC 结构体(即 basePsoDesc)中的某些参数存在问题。下面为你详细分析可能的原因及对应的解决办法:

1. 根签名(pRootSignature)问题

  • 问题描述:在 D3D12_GRAPHICS_PIPELINE_STATE_DESC 中,pRootSignature 是一个重要的参数。如果设置为 nullptr 但实际上需要有效的根签名,或者根签名对象本身无效,就会导致创建管道状态对象失败。
  • 解决办法
    • 确保根签名已经正确创建。如果需要使用根签名,在创建管道状态对象之前创建根签名,并将其指针赋值给 basePsoDesc.pRootSignature。示例代码如下:
// 创建根签名
CD3DX12_ROOT_SIGNATURE_DESC rootSigDesc;
// 配置根签名描述符
// ...Microsoft::WRL::ComPtr<ID3DBlob> serializedRootSig = nullptr;
Microsoft::WRL::ComPtr<ID3DBlob> errorBlob = nullptr;
HRESULT hr = D3D12SerializeRootSignature(&rootSigDesc, D3D12_ROOT_SIGNATURE_VERSION_1, &serializedRootSig, &errorBlob);
if (errorBlob != nullptr)
{OutputDebugStringA((char*)errorBlob->GetBufferPointer());
}
ThrowIfFailed(hr);ThrowIfFailed(md3dDevice->CreateRootSignature(0,serializedRootSig->GetBufferPointer(),serializedRootSig->GetBufferSize(),IID_PPV_ARGS(&mRootSignature)));// 设置管道状态对象描述符的根签名
basePsoDesc.pRootSignature = mRootSignature.Get();

2. 着色器字节码问题

  • 问题描述VS 和 PS 成员分别表示顶点着色器和像素着色器的字节码。如果字节码无效,例如编译着色器时出错,或者字节码指针和大小设置不正确,就会导致创建失败。
  • 解决办法
    • 确保着色器编译成功。在编译着色器时,检查返回的 HRESULT 值,并处理可能的错误。示例代码如下:
Microsoft::WRL::ComPtr<ID3DBlob> vertexShaderBlob;
Microsoft::WRL::ComPtr<ID3DBlob> pixelShaderBlob;
UINT compileFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)compileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
#endif
HRESULT hr = D3DCompileFromFile(L"shaders.hlsl", nullptr, nullptr, "VS", "vs_5_0", compileFlags, 0, &vertexShaderBlob, nullptr);
if (FAILED(hr))
{if (D3D12_ERROR_FILE_NOT_FOUND == hr){throw std::exception("shaders.hlsl not found.");}else{// 获取编译错误信息ID3DBlob* errorBlob;D3DGetBlobPart(vertexShaderBlob.Get(), D3D_BLOB_ERROR_MESSAGE, 0, &errorBlob);if (errorBlob){std::cerr << static_cast<const char*>(errorBlob->GetBufferPointer()) << std::endl;errorBlob->Release();}throw std::exception("Vertex shader compilation failed.");}
}
ThrowIfFailed(hr);hr = D3DCompileFromFile(L"shaders.hlsl", nullptr, nullptr, "PS", "ps_5_0", compileFlags, 0, &pixelShaderBlob, nullptr);
ThrowIfFailed(hr);// 设置管道状态对象描述符的着色器字节码
basePsoDesc.VS = { vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize() };
basePsoDesc.PS = { pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize() };

3. 输入布局(InputLayout)问题

  • 问题描述InputLayout 定义了顶点数据的格式。如果输入布局的描述不正确,例如元素数量为 0 或者元素的格式设置错误,就会导致创建失败。
  • 解决办法
    • 确保输入布局的描述正确。检查输入元素的数量、格式和偏移量等信息。示例代码如下:
std::vector<D3D12_INPUT_ELEMENT_DESC> mInputLayout =
{{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }
};
basePsoDesc.InputLayout = { mInputLayout.data(), (UINT)mInputLayout.size() };

4. 其他参数问题

  • 问题描述D3D12_GRAPHICS_PIPELINE_STATE_DESC 中的其他参数,如 RasterizerStateBlendStateDepthStencilState 等,如果设置不正确,也可能导致创建失败。
  • 解决办法
    • 确保这些参数的设置符合你的需求。可以使用 CD3DX12 辅助类来设置默认值,例如:
basePsoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT);
basePsoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
basePsoDesc.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计Python+Spark知识图谱医生推荐系统 医生门诊预测系统 医生数据分析 医生可视化 医疗数据分析 医生爬虫 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Vue事件处理 - 绑定事件

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue事件处理 - 绑定事件及事件处理 目录 事件处理 绑定方式 函数表达式 绑定函数名 输入框绑定事件 拿到输入框的值 传值加事件源 事件第三种写法 总结 事件处理 绑定方式 函数表达式 在按钮上使用函数表达式绑定事…

World of Warcraft [CLASSIC] 80 Four Horsemen (Naxxramas)

纳克萨玛斯 天启四骑士 Four Horsemen 图一&#xff1a;10人同生共死 图二&#xff1a;25人同生共死站位 图三&#xff0c;不做同生共死&#xff0c;做永恒者&#xff0c;击杀白马分布图&#xff0c;主要是不熟练乱跑&#xff0c;容易导致减员失败 永恒者&#xff0c;玩家无一…

DeepSeek与AI提示语设计的全面指南

当人人都会用AI时&#xff0c;你如何用得更好更出彩&#xff1f;本文全面介绍了DeepSeek的功能与使用方法&#xff0c;并深入探讨了AI提示语设计的核心技巧与进阶策略。通过精准的任务定义、提示语优化和人机协作&#xff0c;用户可以从AI的基础使用逐步进阶到创新应用&#xf…

DeepSeek-R1两种不同模型变体(deepseek-llm-7b-chat 和 deepseek-llm-7b-base)之间的区别

deepseek-llm-7b-chat 和 deepseek-llm-7b-base 是基于同一参数量级&#xff08;7B&#xff09;的两种不同模型变体&#xff0c;主要区别在于训练目标、适用场景和性能表现。以下是详细对比&#xff1a; 1. 核心区别 特性deepseek-llm-7b-basedeepseek-llm-7b-chat训练目标通用…

HarmonyOS Next 方舟字节码文件格式介绍

在开发中&#xff0c;可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中&#xff0c;arkts会编译成方舟字节码。方舟字节码长什么样呢&#xff1f;我们以一个demo编译出的abc文件&#xff1a; 二进制就是长这样&#xff0c;怎么去理解呢&…

TCP/IP 协议图解 | TCP 协议详解 | IP 协议详解

注&#xff1a;本文为 “TCP/IP 协议” 相关文章合辑。 未整理去重。 TCP/IP 协议图解 退休的汤姆 于 2021-07-01 16:14:25 发布 TCP/IP 协议简介 TCP/IP 协议包含了一系列的协议&#xff0c;也叫 TCP/IP 协议族&#xff08;TCP/IP Protocol Suite&#xff0c;或 TCP/IP Pr…

【C++11】lambda和包装器

1.新的类功能 1.1默认的移动构造和移动赋值 原来C类中&#xff0c;有6个默认成员函数&#xff1a;构造函数/析构函数/拷⻉构造函数/拷⻉赋值重载/取地址重 载/const 取地址重载&#xff0c;最后重要的是前4个&#xff0c;后两个⽤处不⼤&#xff0c;默认成员函数就是我们不写…

zabbix监控nginx指标

使用nginx作为web服务器&#xff0c;我们需要清晰知道&#xff1a; 1.nginx的工作状态 2.请求数有多少&#xff0c;多少是已经响应完成的&#xff0c;多少是响应失败的 3.nginx服务以及端口监听情况是否处于运行状态 当出现服务停止或者大量请求响应失败时&#xff0c;我们需要…

当Axure遇见DeepSeek:设计工具的革命性进化

从传统的平面设计软件到如今的交互原型工具&#xff0c;设计工具经历了多次革命性的进化。然而&#xff0c;随着人工智能技术的不断发展&#xff0c;设计工具正面临又一次重大的变革。Axure&#xff0c;作为设计界知名的原型设计工具&#xff0c;以其强大的功能和灵活的操作性&…

麒麟系统编译安装git

有些版本的麒麟系统上没有git&#xff0c;官网又找不到现成的安装包&#xff0c;只好下载编译进行编译安装 1、下载源码 下载源码&#xff0c;地址&#xff1a;https://git-scm.com/downloads/linux。 2、解压 直接鼠标右键解压&#xff0c;或者用命令行&#xff1a; tar …

【Matlab优化算法-第15期】基于NSGA-II算法的铁路物流园区功能区布局优化

基于NSGA-II算法的铁路物流园区功能区布局优化 一、前言 铁路物流园区的合理布局对于提高物流效率、降低运营成本具有重要意义。随着铁路物流的快速发展&#xff0c;传统的铁路货场需要升级为综合物流园区&#xff0c;以满足多式联运和综合物流服务的需求。本文将介绍一种基于…

SpringSecurity高级用法

SpringSecurity的高级用法&#xff0c;包括自定义loginUrl携带参数&#xff0c;自定义认证校验逻辑&#xff0c;自定义权限校验逻辑。 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-advanced-security 一、概述 在项目实际开发过程中&#xff0c;Spr…

【韩顺平linux】部分上课笔记整理

整理一下一些韩顺平老师上课时候的笔记 课程&#xff1a;【小白入门 通俗易懂】韩顺平 一周学会Linux linux环境&#xff1a;使用阿里云服务器 笔记参考 &#xff1a; [学习笔记]2021韩顺平一周学会Linux 一、自定义函数 基本语法 应用实例&#xff1a; 计算两个参数的和…

k8s证书过期怎么更新?

在 Kubernetes 集群中&#xff0c;证书过期可能导致集群不可用&#xff0c;尤其是 API Server、Controller Manager、Scheduler 等组件所使用的证书。为了恢复集群的正常运行&#xff0c;您需要更新这些证书。以下是更新 Kubernetes 证书的基本步骤&#xff1a; 1. 检查证书状…

DeepSeek-R1 本地电脑部署 Windows系统 【轻松简易】

本文分享在自己的本地电脑部署 DeepSeek&#xff0c;而且轻松简易&#xff0c;快速上手。 这里借助Ollama工具&#xff0c;在Windows系统中进行大模型部署~ 1、安装Ollama 来到官网地址&#xff1a;Download Ollama on macOS 点击“Download for Windows”下载安装包&#x…

新站如何快速被搜索引擎收录?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/106.html 新站快速被搜索引擎收录是一个综合性的任务&#xff0c;涉及多个方面的优化工作。以下是一些关键步骤和策略&#xff0c;有助于新站快速被搜索引擎收录&#xff1a; 一、提交网站…

推荐一款 免费的SSL,自动续期

支持自动续期 、泛域名 、可视化所有证书时效性 、可配置CDN 的一款工具。免费5个泛域名和1个自动更新。 链接 支持&#xff1a;nginx、通配符证书、七牛云、腾讯云、阿里云、CDN、OSS、LB&#xff08;负载均衡&#xff09; 执行自动部署脚本 提示系统过缺少crontab 安装cro…

HiveQL命令(三)- Hive函数

文章目录 前言一、Hive内置函数1. 数值函数2. 字符串函数3. 日期与时间函数4. 条件函数5. 聚合函数6. 集合函数7. 类型转换函数8. 表生成函数 (UDTF) 前言 在大数据处理和分析的过程中&#xff0c;数据的转换和处理是至关重要的环节。Apache Hive作为一种流行的数据仓库工具&a…

UE5--浅析委托原理(Delegate)

委托概述 委托是一种用于事件处理的机制。通过使用委托&#xff0c;可以将一个或多个函数绑定到一个事件上&#xff0c;在事件触发时自动调用这些函数。代理也叫做委托&#xff0c;比如&#xff1a;跳&#xff0c;跑&#xff0c;开枪&#xff0c;伤害等响应&#xff0c;就是注…