DX11六边形绘制的两种方法和xj博客的学习感悟

1.(图元类型为D3D11_PRIMITIVE_TOPOLOGY_LINELIST)

Triangle list(左) or triangle strip(右)



该方法通过四个三角形就能拼出一个六边形,则需要十二个顶点。

通过改变顶点个数位置,以及draw函数中的顶点个数的参数以及图元类型就能实现一个六边形

修改代码部分以及运行结果贴图如下:



六边形架构实例分析 六边形构图设计_hlsl



2.(图元类型为D3D11_PRIMITIVE_TOPOLOGY_STRIP)

Triangle list(左) or triangle strip(右)



该方法特殊在是几边形就需要几个顶点且按照v1,v2,v3;v2,v4,v3诸如此类的顺时针顺序画出每个三角形,所以通过六个顶点就能拼出一个六边形,节约了一些空间。

通过改变顶点个数位置,以及draw函数中的顶点个数的参数以及图元类型就能实现一个六边形

修改代码部分以及运行结果贴图如下:

六边形架构实例分析 六边形构图设计_渲染管线_02



3.(学习感悟)

初学时的渲染管线如图所示


六边形架构实例分析 六边形构图设计_dx_03

输入装配阶段在我看来就可以比喻成一辆车子装满油,设好车辆参数,去往什么目的地的一个设置过程。

顶点着色器阶段就是把所输入的顶点进行一系列的处理变化,如3D中的点变成平面2D上的点

光栅化阶段通俗来说就是写入屏幕的过程,特此注意!!! 对于三角形来说,不同的顶点顺序有不同的含义。默认情况下,三角形的顶点绕顺时针排布时(从摄像机朝着该三角形看)则说明当前三角形的面朝向当前摄像机,而三角形的顶点绕逆时针排布则说明当前三角形的面背对当前摄像机。对于背朝摄像机的三角形会被剔除,从而不进行光栅化。这种做法叫背面消隐

像素着色器阶段就是进行像素插值的过程,使得三角形内部被填充上颜色。

输出合并阶段就是进行一系列的测试

页面翻转

为了避免动画中出现画面闪烁的现象,最好将动画帧完整地绘制在一种称为后备缓冲区(back buffer)的离屏纹理内。这样观者就不会察觉出帧的绘制过程而只看到完整的动画帧。而前台缓冲区(front buffer)则为当前显示在屏幕上的动画帧,它的构造和前台缓冲区是一样的。通过硬件可以做到,在后备缓冲区的动画帧绘制完成后,通过指针交换的形式,将原来的后备缓冲区变为前台缓冲区,而前台缓冲区则变成下一帧待绘制的后备缓冲区。这种做法避免了内容上的拷贝,有效提升效率。这种翻转操作是在**桌面窗口管理器(DWM)**内实现的。

主要下面两种方式:

BitBlt Model(位块传输模型):将后备缓冲区的数据进行BitBlt(位块传输,即内容上的拷贝),传入到DWM与DX共享的后备缓冲区,然后进行翻转以显示其内容。使用这种模型至少需要一个后备缓冲区。事实上,这也是Win32应用程序最常使用的方式,在进行呈现后,渲染管线仍然是对同一个后备缓冲区进行输出。(支持Windows 7及更高版本)

Flip Model(翻转模型):该模型可以避免上一种方式多余的复制,后备缓冲区表面可以直接与DWM内的前台缓冲区进行翻转。但是需要创建至少两个后备缓冲区,并且在每次完成呈现后通过代码切换到另一个后备缓冲区进行渲染。该模型可以用于Win32应用程序以及UWP应用程序(需要DXGI1.2,支持Windows 8及更高版本

六边形架构实例分析 六边形构图设计_hlsl_04

对一些专有名词的通俗解释:

D3D设备(ID3D11Device)通常代表一个显示适配器(即显卡),它最主要的功能是用于创建各种所需资源,最常用的资源有:资源类(ID3D11Resource, 包含纹理和缓冲区),视图类以及着色器。此外,D3D设备还能够用于检测系统环境对功能的支持情况。

D3D设备上下文(ID3D11DeviceContext)可以看做是一个渲染管线。通常我们在创建D3D设备的同时也会附赠一个立即设备上下文(Immediate Context)。一个D3D设备仅对应一个D3D立即设备上下文,并且只要我们拥有其中一方,就能通过各自的方法获取另一方(即ID3D11Device::GetImmediateContext和ID3D11DeviceContext::GetDevice)。渲染管线主要负责渲染和计算工作,它需要绑定来自与它关联的D3D设备所创建的各种资源、视图和着色器才能正常运转,除此之外,它还能够负责对资源的直接读写操作。

负责渲染和计算工作,它需要绑定来自与它关联的D3D设备所创建的各种资源、视图和着色器才能正常运转,除此之外,它还能够负责对资源的直接读写操作。