|

楼主 |
发表于 2012-6-9 00:22:00
|
显示全部楼层
Re:LOD 地形渲染问题
问题已经解决了,问题出在DrawIndexedPrimitive:
HRESULT DrawIndexedPrimitive(
D3DPRIMITIVETYPE Type,
INT BaseVertexIndex,
UINT MinIndex,
UINT NumVertices,
UINT StartIndex,
UINT PrimitiveCount
);
Type——不用过多解释的参数,就是图元类型,像是线段、三角形等等。
BaseVertexIndex——这个用作偏移量,比如我们在索引缓冲中的顶点是Vx=10(Vx表示顶点在顶点数组中的下标,下同),那么Vx实际上传递到显卡是Vx+BaseVertexIndex,为什么要加上这个参数呢?他的好处在于,如果我一次性在一个顶点缓冲中加上了别的几个顶点缓冲,那么我再用一个索引缓冲去定位顶点的话就会有问题,比如原先有个缓冲A,其中某个顶点Vx=10,那么现在我把这个缓冲附到了某个缓冲B后面,这个时候顶点的索引依旧是Vx=10,但是下标为10的这个顶点已经不是原来那个了,因为前面加上了缓冲B。对于老版的DX8,我们可以通过修改索引缓冲达到相应的效果,然而这项操作的时间复杂度是O(n),现在我们就用不到了,只要交给DX自己处理。
MinIndex——下标最小的顶点,顾名思义,就是在本次绘图过程中用到的下标最小的顶点。(估计给D3D做优化用,参考下一个参数的说明)
NumVertices——这恐怕是最坑爹的参数,网上给出的说法都是:用到的顶点数,但实际上呢?如果尝试用用到的顶点数去做参数的话,在PIX中调试程序,会出现各种错误,像是Index Out Of Range(索引超越边界),严重的导致PIX崩溃。在查阅了大量资料后,终于知道了这个参数的含义:一次绘图中顶点索引的跨度(即Vmax-Vmin+1),只是跨度而不一定是顶点数目,也就是说可以包含一些没有用到的顶点……这么说来,用作优化还真是很有道理的,因为在知道MinIndex以后,D3D就可以把MinIndex~MinIndex+NumVertices这段的数据提取出来用于渲染,省去了不必要的内存开销……
StartIndex——这个函数很简单,表示索引缓冲中开始的那个下标
PrimitiveCount——绘制的图元个数,配合StartIndex来定位索引缓冲 |
|