DirectX12 简单入门(一)

news2024/11/26 22:22:31

在很久以前写过关于DirectX9的一些应用,直到现在DirectX12已经普及了。写完几个DirectX12测试代码之后,写一篇DirectX12简单入门介绍一下基本概念,以及环境搭建和编程过程。

编程环境

与DirectX9不同,在DirectX12开发中微软将需要单独下载的DirectX的SDK直接集成到了WindowsSDK中。因为VisualStudio的网络特性,除了单独下载安装WindowsSDK以外,可以直接利用VisualStudio Installer来选择需要需安装的Windows SDK的版本。我是用的是Visual Studio 2022 Community版本。同样的因为我的目标机器就是我本机,是windows版本是10.1.19044,于是选择的SDK版本为10.1.19041.0。

 选择安装之后,会自动安装并且将对应SDK的路径注册到环境变量里面, 避免了DirectX9时代需要手动配置DirectX的环境变量来包含相应的头文件和库。

另外DirectX也只支持C++进行开发。另外DirectX所有系列都是基于COM架构来设计的接口。因此除了要求开发者具备C++编程能力以外,还需要掌握COM变成的基本能力。 

当WindowsSDK安装完成之后就能在VisualStudio中创建一个C++桌面程序了。除了windows.h以及相关windows32的库默认会被VisualStudio添加以外,还需要额外配置编译时用到的库D3d12.h, D3d12.dll, dxgi.lib。

之后就可以使用d3d12.h和dxgi相应头文件调用相应的API了。

编程流程

从最高的视角来看。整个过程和DirectX之前的版本,甚至与GDI/GDI+编程过程都类似,都可以分为4部分,不过DirectX12根据现代GPU的特性抽象出来了许多概念来进行操作。

  1. 初始化
  2. 加载资源
  3. 循环渲染
  4. 销毁对象

接着具体来介绍一下每个阶段需要具体完成什么任务,以及用到哪些对象。

初始化

  1. 首先需要执行进行渲染的显卡,操作为通过创建IDXGIFactory对象来选择一个可以用来渲染的显卡对象,接口为IDXGIAdapter。
  2. 在选定的显卡对象上通过D3D12CreateDevice创建一个同于渲染的设备对象ID3D12Device。该对象可以看作真实显卡中进行渲染的硬件的抽象接口。
  3. 得到ID3D12Device接口后就需要创建与其进行通信通道,在DirectX中,这个对象被称为命令队列。也就是ID3D12CommandQueue接口。创建完成后渲染的操作都会通过命令队列发送给进行渲染的硬件。
  4. 接着会需要准备进行渲染的目标。这里需要注意两个概念。SwapChain以及窗口。对DirectX编程架构来说为了避免出现画面撕裂,因此都采用了双缓冲策略,所以被渲染的相关资源都是被放在SwapChain中进行交替操作。而具体什么时候进行真正的Front Buffer和Back Buffer切换是根据不同场景分别由DWM和应用自己来控制。因此在创建渲染目标的Buffer时实际上时创建的SwapChain即CreateSwapChainForHwnd。这里会设计到窗口概念和flip的概念。按照传统的显示资源管理模式。DWM会按照Window来管理并组合所绘制的内容。但是实际上也会新的DirectComposition模式,可以不需要真正的窗口句柄来管理。简单起见这里使用窗口句柄,来将创建的渲染目标即IDXGISwapChain绑定上一个窗口句柄,并且关联上CommandQueue。
  5. 接下来需要给渲染设备ID3D12Device创建一些渲染需要用到的资源,在DirectX中都可以称之为Descriptor。其中的集合可以成为Descriptor Heap。在进行渲染时操作对象不能直接对SwapChain中的Buffer进行操作。DirectX里需要通过创建SwapChain中对应的RenderTargetView来进行操作即CreateRenderTargetView创建。
  6. 最后还需要通过CreateCommandAllocator创建ID3D12CommandAllocator接口。其代表着管理所有需要操作的Command的相关资源。

做完以上步骤就将渲染的硬件资源的抽象接口准备好了。接下来就需要将渲染使用到的资源,很多都是和GPU Render用到的相关的一些对象。

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

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

相关文章

『MySQL 实战 45 讲』“order by” 是怎么工作的

“order by” 是怎么工作的 首先创建一个表 CREATE TABLE t ( id int(11) NOT NULL, city varchar(16) NOT NULL, name varchar(16) NOT NULL, age int(11) NOT NULL, addr varchar(128) DEFAULT NULL, PRIMARY KEY (id), KEY city (city) ) ENGINEInnoDB;全字段排序 在 cit…

自己搭建go web 框架

思想base部分day1:封装gee封装context上下文封装tree路由树分组封装group与中间件封装文件解析封装封装错误处理 思想 web框架服务主要围绕着请求与响应来展开的 搭建一个web框架的核心思想 1 便捷添加响应路径与响应函数(base) 2 能够接收多种数据类型传入(上下文context) 3 构…

【Linux】Linux入门学习之常用命令五

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

支付系统设计五:对账系统设计01-总览

文章目录 前言一、对账系统构建二、执行流程三、获取支付渠道数据1.接口形式1.1 后台配置1.2 脚本编写1.2.1 模板1.2.2 解析脚本 2.FTP形式2.1 后台配置2.2 脚本编写2.2.1 模板2.2.2 解析脚本 四、获取支付平台数据五、数据比对1. 比对模型2. 比对器 总结 前言 从《支付系统设…

AE基础教程

一:粒子插件。 AEPR插件-Trapcode Suite V18.1.0 中文版 二:跟随手指特效。 1:空对象位置关键帧跟随手指。 2:发射粒子位置,按住Alt键,连接到空对象位置处。。 三:CtrI导入素材快捷键。 四&a…

Elasticsearch基础学习-常用查询和基本的JavaAPI操作ES

关于ES数据库的和核心倒排索引的介绍 一、Elasticsearch概述简介关于全文检索引擎关系型数据库的全文检索功能缺点全文检索的应用场景Elasticsearch 应用案例 二、Elasticsearch学习准备安装下载关于es检索的核心-倒排索引正向索引(forward index)倒排索…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-自动变道-1

书接上回 2.3.4.自动变道 当车辆处于导航引导模式NOA功能时(即车辆横向控制功能激活),且车速大于40km/h,驾驶员按下转向灯拨杆或系统判断当前有变道需要时,自动变道系统通过对车道线、自车道前方目标距离、邻近车道前后方目标距离等环境条件进行判断,在转向灯亮起3s后控…

看到这个数据库设计,我终于明白了我和其他软测人的差距

测试人员为什么要懂数据库设计? 更精准的掌握业务,针对接口测试、Web 测试,都是依照项目/产品需求进行用例设计,如果掌握数据库设计知识,能直接面对开发的数据表,更好、更精准的理解业务逻辑;有…

【滑动窗口】滑窗模板,在小小的算法题里滑呀滑呀滑

首先大家先喊出我们的口号:跟着模板搞,滑窗没烦恼! 一.什么是滑动窗口? 滑动窗口算法是双指针算法的一种特定化的算法模型,常用于在特定的条件下求最大或者最小的字符串,特定的数组,以及字符序列…

JAVA 可用的高性能docker镜像及如何使用?

目前docker hub上下载量很大的java、openjdk镜像都已经被弃用,不再维护,目前可用的java docker镜像有哪一些呢?哪一些镜像是主流的? 本文带有领略java可用的镜像资源、如何使用它们,如何构建springboot镜像? 1. 可用的java镜像 1.1. amazoncorretto 1.1.1. 什么是Corr…

环路详解:交换机环路产生的过程和原因图解

前言: 在了解环路之前得先了解交换机的工作原理,当然交换机的基本工作原理其实非常简单,只有“单播转发与泛洪转发”、“交换机MAC地址表”这两个!其他的如vlan,生成树等也是在此基础上增加的,弥补交换机基…

node笔记_koa框架的路由

文章目录 ⭐前言⭐koa 原生路由写法⭐引入 koa-router💖 安装koa-router💖 动态读取路径文件作为路由 ⭐结束 ⭐前言 大家好,我是yma16,本文介绍koa框架的路由。 往期文章 node_windows环境变量配置 node_npm发布包 linux_配置no…

[网络安全]DVWA之XSS(Reflected)攻击姿势及解题详析合集

[网络安全]DVWA之XSS(Reflected)攻击姿势及解题详析合集 XSS(Reflected)-low level源代码姿势 XSS(Reflected)-medium level源代码姿势1.双写绕过2.大小写绕过 XSS(Reflected)-high level源代码str_replace函数 姿势 XSS(Reflected)-Impossible level源代…

ssh正反隧道(代理msf对icmp穿透监听)

ssh正向隧道: 就是将本地端口映射到远程上,相当访问本地端口就是访问远程的端口 正向 访问本地对应的是远程的端口 ssh -fNCL 本地ip:本地port:远程ip:远程port 用户远程ip/域名 实例: ssh -fNCL 192.168.222.128:90:192…

HTML的表单

前后端交互过程: 表单在 Web 网页中用来给访问者填写信息采集客户端信息,使网页具有交互的功能,用户填写完提交后,表单的内容就从客户端的浏览器传送到服务器上,经过服务器上程序处理后,再将用户所需信息传…

人机大战?——带你玩转三子棋(C语言)

TOC 1、前言 在学习完数组之后,我们就可以自己来实现一个简单游戏—三子棋了! 为了确保程序的独立性:我们创建了一个源函数game.c 和test.c,一个头文件game.h test.c——测试游戏 game.c——游戏函数的实现 game.h——游戏函数…

Redis缓存数据库(三)

目录 一、概述 1、Redis架构 2、AKF 3、CAP原则 一、概述 1、Redis架构 Redis 有哪些架构模式?讲讲各自的特点 单机版 特点:简单 问题: 1、内存容量有限 2、处理能力有限 3、无法高可用。 主从复制 Redis 的复制(replic…

python绘制散点图|散点大小和颜色深浅由数值决定

python绘图系列文章目录 往期python绘图合集: python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取excel数据并绘制多y轴图像 python绘制柱状图并美化|不同颜色填充柱子 python随机…

【嵌入式系统应用开发】FPGA——HLS入门实践之led灯闪烁

目录 1 HLS1.1 HLS简介1.2 HLS与VHDL/Verilog1.3 HLS优点与局限 2 环境配置3 HLS实例——Led点亮3.1 工程创建3.2 添加文件3.3 C仿真与C综合3.4 创建Vivado工程3.5 导入HLS生成的IP核3.6 添加实验代码3.7 编译生成获取结果 总结 1 HLS 1.1 HLS简介 HLS(High Level Synthesis)…

十大排序算法(上)直接插入排序、希尔排序、直接选择排序、堆排序

🌈目录 1. 排序的概念2. 常见的排序算法3. 排序算法的实现3.1 插入排序3.1.1 直接插入排序3.1.2 希尔排序(缩小增量排序) 3.2 选择排序3.2.1 基本思想3.2.2 直接选择排序3.2.3 堆排序 1. 排序的概念 排序,就是使一串记录&#xf…