DX12阅读笔记_第四章_1

DX12出来许久直到现在才来读一读··。顺便复习一下DX相关知识吧。直接从第四章开始。

第四章开头提出本章的知识点:

  1. 了解Direct3D在3D硬件编程中的作用
    2.理解COM在Direct3D中扮演的角色
    3.学习基本的图形概念,如二维图像如何存储,页面翻转,深度缓冲,多采样,以及CPU和GPU如何交互
    4.了解如何使用性能计数器函数获得高分辨率计时器读数
    5.来了解如何初始化Direct3D
    6.熟悉本书所有演示使用的应用程序框架的一般结构

第一点:
(1) Direct3D是一个低级的图形API(应用程序编程接口),用于从我们的应用程序中控制和编程GPU(图形处理单元),从而允许我们使用硬件加速渲染虚拟的3D世界。
(2) Direct3D层和硬件驱动程序将Direct3D命令转换为系统的GPU能够理解的本机指令。
(3) DX12新特性:Direct3D 12添加了一些新的渲染特性,但相对于前一个版本的主要改进是,它经过了重新设计,以显著减少CPU开销并改进对多线程的支持。比之前的版本跟贴近底层所以抽象性更少,更加符合当前GPU的架构。

第二点:
(1) 组件对象模型(COM)是一种允许DirectX独立于编程语言并具有向后兼容性的技术。(2) 我们可以通过特殊的函数或其他COM接口的方法获取指向COM接口的指针,也就是不使用c++ new关键字创建COM接口。
(3) COM对象是引用计数。(微软提供了对于COM对象的智能指针ComPtr,这里是官方文档

https://github.com/Microsoft/DirectXTK/wiki/ComPtr)

(4) 当我们完成一个接口时,我们调用它的Release方法(所有COM接口从IUnknown COM接口继承功能,它提供Release方法),而不是删除COM对象。COM对象将释放它们的内存,直到它们的引用计数为0。
(5) 主要使用的3个方法:

一:Get:返回一个指向底层COM接口的指针。这通常用于向具有原始COM接口指针的函数传递参数。
	      eg:ComPtr<ID3D12RootSignature> mRootSignature;
		… // SetGraphicsRootSignature expects  ID3D12RootSignature* argument
		mCommandList->SetGraphicsRootSignature(mRootSignature.Get());
	二:GetAddressOf:返回指向底层COM接口的指针的地址。这通常用于通过函数参数返回COM接口指针。
	      eg:ComPtr<ID3D12CommandAllocator> mDirectCmdListAlloc;
		 …
	ThrowIfFailed(md3dDevice->CreateCommandAllocator( D3D12_COMMAND_LIST_TYPE_DIRECT, 
								mDirectCmdListAlloc.GetAddressOf()));
	三:Reset:将ComPtr实例设置为nullptr,并递减底层COM接口的引用计数。

COM接口一般前缀为I。比如ID3D12GraphicsCommandList.
第三点:
二维纹理一般用来存储某些类型的数据元素格式:

(1):DXGI_FORMAT_R32G32B32_FLOAT:每个元素都是三个32位浮点分量。
	(2):DXGI_FORMAT_R16G16B16A16_UNORM:每个元素有四个16位的分量,映射到[0,1]范围。
	(3):DXGI_FORMAT_R32G32_UINT:每个元素有两个32位无符号整数分量。
	(4):DXGI_FORMAT_R8G8B8A8_UNORM:每个元素都有四个映射到[0,1]范围的8位无符号分量。
	(5):DXGI_FORMAT_R8G8B8A8_SNORM:每个元素都有四个映射到[- 1,1]范围的8位有符号分量。
	(6):DXGI_FORMAT_R8G8B8A8_SINT:每个元素都有四个映射到[- 128,127]范围的8位有符号整数分量。
	(7):DXGI_FORMAT_R8G8B8A8_UINT:每个元素有4个映射到[0,255]范围的8位无符号整数分量。

页面翻转:硬件维护两个纹理缓冲区,一个称为前缓冲区,另一个称为后缓冲区。前端缓冲区存储当前正在监视器上显示的图像数据,而下一帧动画正在绘制到后端缓冲区。
在帧被绘制到后端缓存之后,后端缓存和前端缓存的翻转:后端缓存成为前端缓存,前端缓存成为下一帧动画的后端缓存。通过交换两个缓冲区的指针实现这个操作。
前后缓冲区构成交换链,在D3D中交换链由 IDXGISwapChain 接口表示。这个接口存储前后缓冲区纹理,以及提供调整缓冲区大小的方法

  (IDXGISwapChain::ResizeBuffers) 以及提交接口 (IDXGISwapChain::Present)。

深度缓冲:深度缓冲区是一个纹理不包含图像数据而是关于特定像素的深度信息的例子。深度缓冲区是一块内存区域,专门存储着每个像素点(在屏幕上绘制的)深度值,深度值越大(Z值)越大,则离摄像机越远。深度缓冲区的每个元素与后缓冲区的每个像素之间存在一一对应关系(即后缓冲区的第ij元素与深度缓冲区的第ij元素对应)。
对于深度缓冲,我们绘制对象的顺序并不重要(画家算法需要绘制顺序)。
首先,在任何渲染发生之前,后台缓冲区被清除为默认颜色,深度缓冲区被清除为默认值——通常是1.0(一个像素可以拥有的最远深度值)。我们只在找到一个深度值较小的像素时更新深度缓冲区中的像素及其对应的深度值。用这种方法遍历完场景后得到的像素是最靠近摄像机的将会被渲染。

深度缓冲是一种纹理,所以它必须以特定的数据格式创建。用于深度缓冲的格式如下:

(1)DXGI_FORMAT_D32_FLOAT_S8X24_UINT:指定一个32位浮点深度缓冲区,有8位(无符号整数)预留给模板缓冲区,映射到[0,255]范围,24位未用于填充。
(2)DXGI_FORMAT_D32_FLOAT_S8X24_UINT:指定一个32位浮点深度缓冲区。
(3)DXGI_FORMAT_D32_FLOAT_S8X24_UINT:指定映射到[0,1]范围的无符号24位深度缓冲区,并为映射到[0,255
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值