本文主要是介绍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 = 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;
下图展示了几种典型的拓扑方式, 更多细节请参考文档和相关书籍.
- (a) point list
- (b) line strip
- (c) line list
- (d) trangle strip
实际上我们使用更多的是 Triangle List , 他不像Triangle Strip那样彼此相连, 虽然这样在表示连续的图形时会浪费顶点, 但是好在我们可以使用索引缓存最大程度上减少这种浪费. 更重要的是由于不需要连续, 相较于Triangle Strip要更加灵活.
这篇关于Primitive Topology的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!