《Practical Rendering & Computation with Direct3D11》读书总结 Chapter-1-Overview Of Direct3D 11

本章概述了Direct3D 11的基础知识,包括其框架结构、图形架构和Direct3D与GPU的交互。重点讨论了渲染和计算管线,解释了Tessellation Stage在提高渲染效果中的作用。资源管理部分介绍了Texture和Buffer的分类,以及Resource Views在流水线中的使用。此外,阐述了Direct3D的关键接口,如Device和Device Context,以及如何初始化Direct3D应用。
摘要由CSDN通过智能技术生成

章节概括

本章主要简要描述了Direct3D的架构以及它是如何与GPU硬件交互的、简要探讨了D3D11中的Pipeline,介绍了一些组件,最后以一个简短的Direct3D初始化的例子介绍了对于Dx的初始化需要做哪些工作。

1.1 Direct3D 的框架

Direct3D是一套用来与显卡交流并控制显卡的Native API,并以此来渲染图像。之所以说它是Native的,是因为它被设计成可以被C/C++语言使用的,大部分直接使用它的方法就是通过C/C++程序,如果使用Win32 API就可以有效地减少让Direct11运行的软件层面的操作。

Graphics Architecture
这里写图片描述
由图可见,Application位于整个图形架构的最高层,它主要与Direct3D交互,在下一层,Direct3D运行时会与显卡的UserMode Driver交互,来运行各种由Application组织的命令。这个Driver之后再与DXGI框架交互,DXGI是用来与底层的KernelMode Driver交流的,并且还管理可用的硬件资源,下面简要地来看一下各个组件的功能:
Application:控制整个程序最后需要被呈现在窗口中的各种资源,诸如任意的二维三维物体、图像、文本、动画,对于每个程序来说它往往是特别的、不同的
Direct3D:提供一套API将程序中的上层内容转化为可以被UserModeDriver解析的格式,包括实际要用到的数据以及函数调用的命令序列,这些都是要遵循Direct3D的规则的。
UserModeDriver:在Direct3D接受到了一系列命令之后,UserModeDriver就会生成一些被GPU执行的命令,这些命令执行的结果会被传递到DXGI中
DXGI:根据UserModeDriver命令执行的结果,来操控硬件层面的资源,例如为每一个显卡提供一个适配器(adapter)接口,为SwapChain提供访问(SwapChain包装了一些实际的要被渲染到窗口上的缓存资源)

1.2 Pipeline

理解Direct3D 11最重要的一个环节就是理解它的流水线。之所以称之为流水线是因为它的工作方式是:它读入数据后,经过一些处理,再把数据送出,在过去的几代Dx API中有很多改变,既是做了改变也添加了一些功能。

一个流水线包含了非常多的阶段,每个独立的阶段都提供了一系列独特的可以被开发者更改的参数来实现他们想要的功能,有些阶段提供的可更改的内容非常少,被称作fixed-function stage,而有些阶段是完全可编程更改的,被称作programmable stage,它允许用户自定义的程序被运行,而一般这些程序都是shader程序,因此也被称作 programmable shader stage。
对于每一个可编程的Shader来说,它都有一个通用的特性集合,被称作common shader core,这些特性可以被看做是一个工具集,它可以用来做纹理采样、运算命令,这些不需要用户自己来实现,可以方便地直接使用。

从一个比较高的层面来说,pipeline实际上有两种形式,一种被用来作渲染,另一种被用来作计算,但严格来说它们之间的界限也是比较松的,他们都可以用来实现其他的需求,但是不管怎么说差异还是存在的,下面分别来介绍这两种流水线。

渲染管线(Rendering Pipeline)

这里写图片描述
如果对图形学中的光栅渲染流水线比较熟悉的话,这个管线应该也很容易理解,至于输入装配、VertexShader、PixelShader之类的就不说了,不熟悉的可以去参看图形学的一些基础教程,这里介绍一下Tessellation Stage:这一阶段是用来作曲面细分的,曲面细分技术是比较常用的,在游戏中,当我们的视角离模型比较近时,为了提升渲染的效果,很有必要对模型做更精致的细分,而模型离人比较远时,就没必要细分的很细。DirectX中的这一阶段包含三个环节:

Hull Shader:接受从VertexShader传过来的几何数据,完成两项内容:1.确定一系列的细分参数,这些参数被用来决定怎样来细分当前的几何结构 2.生成细分所需要的控制点

Tessllation:利用Hull Shader获得的细分参数来决定在当前的几何结构中哪些点要被用来采样,并且返回一系列的重心坐标

Domain Shader: 利用Hull Shader生成的控制点和Tessllation阶段生成的重心坐标,生成新的顶点
这里只是对Tessellation Stage的一个简要的描述,后面遇到更加详细的讲解再作补充。

计算管线(Computation Pipeline)
这一管线主要完成脱离传统渲染管线的一些计算任务,所以应当被视作与渲染管线不同的一个完全独立的管线,它只有一个阶段——Compute Shader,在Compute Shader之前,Shader Program被局限在“在某个特定的阶段对输入数据做处理”中,开发者并不能直接地控制哪个线程被使用了,而Compute Shader则不同它可以充分利用GPU的并行特性,实现一些并行运算的算法,并且它提供了共享内存块,可以在运行期让一个线程组内的所有的线程共同使用这些内存块,即它实现了在运行期让线程之间互相交流,还有它能够随机的读写资源,是对传统的Shader的“让资源被绑定为输入或输出”的方式的一个巨大突破。
总的来说,它有三个优势:1.并行运算,多线程 2.共享内存 3.随机读写资源 这些优势都能显著地提升运算性能,Compute Shader的更多细节将在第五章中探讨。

1.3 资源

在Direct3D中资源被分为两类:Texture 和 Buffer ,Texture则被进一步分为一维纹理、二维纹理、三维纹理,Buffer则更加正规通常都是被认作一维的,尽管如此,Buffer还是有很多种类的,例如Vertex Buffer、Index Buffer、Constant Buffer、Structured Buffer、Append and Consume Buffer、Byte Access Buffer
无论是Texture还是Buffer,都提供了不同的使用模式,通常来说,有两个地方会使用资源,一个是在C/C++代码中,另一个是在HLSL代码中,C/C++中主要完成资源的建立、绑定,而HLSL中则更多的关注资源本身的内容。
一个资源为了被使用,必须被绑定在流水线中,它可以被用作数据的输入或者数据的输出,或者两者都是。例如:对于一个VertexBuffer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值