天天看点

Primitive Topology

  在D3D中, 顶点被存储在一个名为Vertex Buffer的数据结构中, 他是一段连续的内存, 顶点被一个挨一个的存储在这个buffer中. 但问题是这个Vertex Buffer只存储了顶点, 并没有指明这些顶点要如何组成几何原型. 所以在D3D中, 我们指明 Primitive Topology 来告诉D3D如何”看待”这一串顶点数据.

  在渲染管线一文中我们知道这部分处理是在INPUT ASSEMBLER阶段进行的, DirectX的API名称定义的非常规范, 我们用来设置原型拓扑的方法便是以”IA”开头的 IASetPrimitiveTopology .

void ID3D11DeviceContext::IASetPrimitiveTopology(
    D3D11_PRIMITIVE_TOPOLOGY Topology);
           

  D3D提供了一个枚举 D3D11_PRIMITIVE_TOPOLOGY 用来表示拓扑方式(MSDN文档). 所有后来的draw call都将遵循这种格式, 直到再次调用IASetPrimitiveTopology改变拓扑方式.

typedef enum D3D11_PRIMITIVE_TOPOLOGY
{
    D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED = ,
    D3D11_PRIMITIVE_TOPOLOGY_POINTLIST = ,
    D3D11_PRIMITIVE_TOPOLOGY_LINELIST = ,
    D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP = ,
    D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST = ,
    D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = ,
    D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ = ,
    D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = ,
    D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = ,
    D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ = ,
    D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST = ,
    D3D11_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST = ,
    //...
    D3D11_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST = ,
} D3D11_PRIMITIVE_TOPOLOGY;
           

  下图展示了几种典型的拓扑方式, 更多细节请参考文档和相关书籍.

  • (a) point list
  • (b) line strip
  • (c) line list
  • (d) trangle strip

  

Primitive Topology

  实际上我们使用更多的是 Triangle List , 他不像Triangle Strip那样彼此相连, 虽然这样在表示连续的图形时会浪费顶点, 但是好在我们可以使用索引缓存最大程度上减少这种浪费. 更重要的是由于不需要连续, 相较于Triangle Strip要更加灵活.

  

Primitive Topology

继续阅读