input assembler 简称IA阶段

读取几何数据,如vertices和indices,然后装配成几何图元。

 
 

vertex可以视为特殊的点,并且在DirectX中可以有更多的属性,可以定义不同格式的vertex,可以包含位置、uv、法线、颜色等等信息。

 
 

图元拓扑

Primitive Topology

渲染管线中vertex被绑定到了vertex buffer中,里面存了一系列vertex,但是没有定义这些点怎么组装成几何图元。比如这里有一堆点,是两两配对装成线,还是三三配对成面呢?在D3D中需要指明图元拓扑规则。D3D中有一个枚举类来进行指定图元装配的拓扑规则。太长了自己去看doc吧

https://docs.microsoft.com/en-us/windows/win32/api/d3dcommon/ne-d3dcommon-d3d_primitive_topology

 
 

捡几个常见的说一下

Point List

D3D_PRIMITIVE_TOPOLOGY_POINTLIST

会把每个vertex画成单独的点

Line Strip

D3D_PRIMITIVE_TOPOLOGY_LINESTRIP

会把vertex画成线,这里如果有n+1个vertex,那么会有n条线

Line List

D3D_PRIMITIVE_TOPOLOGY_LINELIST

和上面那个不一样,这里每两个vertex画成一条线

Triangle Strip

D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP

会画成三角形,会假设这些三角形是关联的,也就是说n+2个点的话绘画出来n个三角形

Triangle List

D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST

每三个点会画成一个单独的三角形

 
 

下图简单的说明了明显的差异


 
 


 
 

图元邻接

 
 


每个三角形有三个相邻的三角形,叫做邻接三角形 adjacent triangles。

几何着色器geometry shader需要用到这些信息。为了让几何着色器获得这些邻接三角形,这些邻接三角形需要和原三角形一起被提交到vertex buffer或者index buffer,并且拓扑规则需要指定为D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ

 
 

Control Point Patch List

不晓得怎么翻译合适,先不翻了。

D3D_PRIMITIVE_TOPOLOGY_N_CONTROL_POINT_PATCHLIST

是一种拓扑类型。vertex数据会被解释为有N个控制点的patch lists。会被用在可选的tessellation阶段,这个在很后面才会解释。

 
 

Indices

举个栗子说明一下索引


 
 


v0点在第二个图形中用了很多次,为了节省vertex buffer,也可以减少显卡的处理压力,只存储一次vertex v0,然后在绘制三角形的时候多次指明使用v0。这一点就是使用索引的意义,使用索引后会变成下面的情况。


 
 


 
 


 
 


虽然索引中有一些重复的,但是比起vertex重复要好很多。