如果要画一个如下图的四边形,是不是应该很简单呢?
给这4个顶点标个序号,这个需要也是顶点信息传入buffer的顺序。
左上:0 右上:1 左下:2 右下:3
在DX11中Draw的方式有很多种,但是大致可以分为两类:根据顶点绘制图形和根据索引绘制图形。顶点是可以直接绘制图形的,但是大部分情况下我们还是使用索引绘制,这是因为绘制时有些顶点可能会重复使用。
图形绘制的规则是由D3D11_PRIMITIVE_TOPOLOGY(原语)控制的,原语的枚举信息是在IA阶段传入渲染管线的,在VS之后的primitive(体元)信息处理阶段会根据枚举的类型,对顶点进行组装,组装成基本的几何体元。最基本的几何体元有点,线,三角形。
这里我们只讨论以三角形为体元,画四边形,使用的是索引绘制的方式。主要是列举不同的原语类型时,顶点与索引的关系。
1.STRIP:D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP
STRIP这种类型的原语,在组装几何体元的时候,它采用一种重叠的方式 012 123,所以如果使用这种方式绘制四边形,顶点和索引的个数相等都是4个。索引传递的顺序是0 1 2 3 而不是 0 1 3 2,这里0123中012是顺时针方向的三角形,而3是一个单独的,这里的算法我也不太理解,它是怎样处理第二个三角形的。但是不能是0132这种四个顶点顺时针的那种,反正吧,这样记住就行了,因为微软也不会对你做任何的解释,规则就是这样的。(左上 右上 左下 右下)
这里需要补充一点的是,绘制的时候有一个过程叫做背面剔除,而面向视点时,如果三角形的三个顶点是以顺时针顺序绘制的,那么这个三角形就是面向视点的也就是正面,反之就是背面。这也是上面的顺序为左上 右上 左下 右下的原因。
2.LIST:D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST
LIST与STRIP的最大区别就是顶点不共用,每个三角形的绘制都是顶点不共用的,这样画四边形的时候,顶点的个数为4,而索引的个数为6。这也是索引的好处,减少了顶点的重复次数,当然索引的好处不只是这些。这样在绘制的时候就是012 213这是顶点的顺序,索引跟顶点的对应关系:0:0 1:1 2:2 3:2 4 :1 5:3。
3.三角形细分:D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST
所有的CONTROL_POINT_PATCH都是用来做Tess的
这个是三个控制点,虽然它并不一定是用来绘制三角形的,但是它可以绘制三角形 - -。三个控制点tess分的时候就是对三角形进行细分,也正好是三个点。所以,体现到顶点上来,其实是跟LIST是一样的。因为是每个三角形作为单位进行细分的。
4.四边形细分:D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST
四边形细分是以四边形为单位的,也就是说每次细分的时候,有四个顶点参入。当然了,本质上来说你在细分的时候可以对这四个顶点做任意的控制。这个的意思是传入4个控制点,而四边形要表示成2个三角形,如果只是有4个控制点的话,那么肯定只能选择STRIP这种方式了。所以,索引的顺序与STRIP是一致的。
这里也可以延伸一下,体元里面只有点,线,面这三种元素。点是肯定不需要细分的,而线和面还是需要的。这个时候对于每次细分传入的控制点的数量可以是0-32的,也就是说,没人规定细分三角形的时候只能使用3个控制点。当你使用四个控制点的时候,完全可以做到细分四边形,细分四边形其实就是组合细分2两个三角形而已。同理,你也可以传入6个控制点来细分四边形。也可以传入更多来细分更复杂的多边形。
总结:本篇的目的是理清一下顶点,索引以及体元之间的关系。这也是自己在tess的时候,通过多次试探的一点点经验的总结。
1.模型是由点绘制的,而这里的点可以有多种表现形式,顶点,索引,控制点。索引并不是完全依附于顶点的,它只是像指针一样指向某个顶点的位置,这个位置是由顶点输入的顺序决定的。在使用索引绘制的时候,尽管它指向了一个顶点,但是这个顶点并不需要一定存在。你可以在VS里面通过索引ID来计算出点的位置,也可以通过索引的值也就是顶点ID来计算出点的位置,这样只要你没有用到顶点的描述信息,顶点是可以不用传入到管线的。
2.tess的时候有些常用的用法,如果我们不去发散的思考,或许只会停留在那些常见的使用方式。但是,事实上tess是一个很灵活的东西,从它的输入信息仅仅是一个个独立的控制点就可以看出。具体的扩展性的用法,以后再研究,暂时还不知道UV信息是否会对它产生约束。至少PN的时候已经用到了多个顶点了。