您的位置:首页 > 产品设计 > UI/UE

【翻(xue)译(xi)】3D Game Programming With DirectX11 - 5.5

2016-02-19 03:54 543 查看

5.5 输入汇编阶段

输入汇编阶段(IA)从内存中读入几何信息(顶点和索引),然后使用它汇编成原始几何信息(三角和线)。(索引以后会讲到,简要地说它定义了顶点如何被结合)。

5.5.1 顶点

数学的讲,三角形的顶点是两条边的交点,线的顶点是端点,单个的点的顶点是它本身。图中所示的顶点的三种用途是顶点最原始的几何形式。不过,在Direct3D中,顶点的定义比这个更加广泛。本质上来说,Direct3D中的顶点除了包含控件位置之外还会包含其他信息,这让我们可以进行复杂的渲染特效。比如,在第七章我们会给我们的顶点添加法线来实现光照效果;第八章我们会给顶点增加纹理坐标来实现贴图效果,Direct3D给我们了一个灵活的定义顶点的格式,我们将会在下一章看到。在本书中我们我们会涉及到多种顶点格式。

5.5.2 原始拓扑

在Direct3D中,顶点被存储在顶点缓冲区中绑定到管线中。一个顶点缓冲区是存储顶点的一段连续的内存。不过,它并没有要求顶点如何被组合在一起的。比如,应该让某两个顶点连成一个线还是让三个顶点连成一个三角形?我们将会通过定义原始拓扑来告诉Direct3D如何将顶点连接成几何信息。

void ID3D11DeviceContext::IASetPrimitiveToplogy(

D3d11_PRIMITIVE_TOPOLOGY Topology);

typedef enum D3D11_PRIMITIVE_TOPOLOGY

{

D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED = 0,

D3D11_PRIMITIVE_TOPOLOGY_POINTLIST = 1,

D3D11_PRIMITIVE_TOPOLOGY_LINELIST = 2,

D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP = 3,

D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4,

D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5,

D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ = 10,

D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = 11,

D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = 12,

D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ = 13,

D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST = 33,

D3D11_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST = 34,



D3D11_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST = 64,

} D3D11_PRIMITIVE_TOPOLOGY;

所有的子绘画的调用都会使用上边这个集合里边的拓扑结构直到拓扑结构被改变为之。如下代码所示。

md3dImmediateContext->IASetPrimitiveTopology(

D3D11_PRIMITIVE_TOPOLOGY_LINELIST);

/* 然后使用线列表的形式画点*/

md3dImmediateContext->IASetPrimitiveTopology(

D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

/* 然后使用三角形列表的形式画点 */

md3dImmediateContext->IASetPrimitiveTopology(

D3D11_PRMITIVE_TOPOLOGY_TRIANGSTRIP);

/* 使用三角带的形式画点 */

下边的几个小节介绍了几种不同的原始拓扑结构。本书中我们主要使用三角形列表这个结构。

5.5.2.1 点列表

由D3D11_PRIMITIVE_TOPOLOGY_POINTLIST来定义。此时每个顶点都会被画成单独的一个点。

5.5.2.2 线带

由D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP来定义。此时顶点会顺次连起来形成一条连续的线。n+1个点会形成n条线。

5.5.2.3 线列表

由D3D11_PRIMITIVE_TOPOLOGY_LINELIST来定义。此时每两个连续的顶点会形成一条独立的线段。2n个顶点会形成n条线。线带和线列表之间的区别是后者可以是不连接的,而前者自然是连接的。通过假定连接性,可以使用更少的点,因为每个点都被两条线共享了。

5.5.2.4 三角形带

由D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP来定义。三角形带是定义三角形被连接成带状(还有扇状)。通过定义这种连接性,每个顶点都被邻近的三角形公用了。n个顶点可以产生n-1个三角形。

5.5.2.5 三角形列表

由D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST来定义。此时每个顶点都被用来形成独立的三角形。3n个顶点形成n个三角形。相比于前者而言三角形列表使用更多的顶点。

5.5.2.6 邻接基元

一个带有邻接的三角形列表的意思是,对于每个桑拿叫醒你也可以把它的邻接的三角形包含在内。(图中有示什么叫邻接,反正就那么个意思)。这是用来做几何着色器的,这里每个特定的集合着色程序需要访问邻接三角形。临界三角形需要和原始三角形一起被提交给顶点/索引缓冲区,并且用D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ这个拓扑结构。注意到邻接三角形只是被用来作为几何着色器的输入,并不会被画出来。如果没有几何着色器,邻接三角形也还是不会被画出来。

5.5.2.7 控制点片

由D3D11_PRIMITIVE_TOPOLOGY_n_CONTROL_POINT_PATCHLIST 定义。意思是顶点数据被解释为一个有N个控制点的补丁列表。它被用来在渲染管线的嵌入阶段(可选的阶段)。所以我们将会在13章再讲这个。

5.5.3 索引

前边已经提到了,三角形是固体3D物体的基本构成单元。下边的代码展示了一个用来创建四边形和八边形的顶点列表。(就是俩列表,略)。

Tips: 你声明三角形顶点的顺序很重要,因为会被依序访问到。5.12会讲到。

如图所示,形成3D物体的三角形会共享许多顶点,虽然复制顶点一两次并不是太坏,但是在八边形的情况下就要复制七次了。通常的,复制会随着模型细节的增加而增加。

我们有下面这两个不想复制点的原因:

1) 占用更多的内存(为什么要存储同一个顶点多次?)

2) 增加了图形卡的加载(为什么要加载同一个顶点多次?)

三角形带子啊某些情形下可以帮助解决复制的问题,提供了一种带状的结婚结构。人呢人,三角形列表时更加灵活的(三角形不需要被连接),所以我们值得发明一种对抗三角形列表的复制问题的方法。这个方法就是用索引:我们创建一个顶点的列表和索引的列表。定点列表由不同的顶点组成,索引列表由顶点列表中的索引构成,索引会定义如何将顶点组合成三角形。

Vertex v[4] = {v0, v1, v2, v3};

UINT indexList[6] = {0, 1, 2, 0, 2, 3};

在索引列表里边,每三个元素定义一个三角形。类似的,定义一个圆形可以如下(略)。

当顶点列表中每个独立的顶点被加载之后,图形卡就是用索引列表来把顶点组合到一块。注意我们把复制操作转移到了索引列表,不过这还不太坏:

1) 索引是普通整数不会像顶点那样完整的结构一样耗内存

2) 当顶点缓存的顺序定义的比较好的时候,图形卡不需要经常(太经常)加载复制的顶点

翻译存疑:

input assembler state: 输入汇编阶段

primitive topology: 原始 拓扑

point list: 点列表

line strip: 线带

line list: 线列表

primitives with adjacency: 邻接基元

adjacent triangle: 邻接三角形

primitive with adjacency: 邻接基元

control point patch list: 控制点片

patch lists with N control points: 有N个控制点的补丁列表

tessellation stage: 嵌入阶段
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: