使用mesh创建地形网格时大小受限

D3DXCreateMeshFVF((nRows-1)*(nCols-1)*2,(nRows-1)*(nCols-1)*4 , D3DXMESH_MANAGED , TERRAINVERTEX::FVF, m_pd3dDevice, &m_pMesh);//(nRows-1)*(nCols-1)*4

TERRAINVERTEX pVertices=NULL;

m_pMesh->LockVertexBuffer(0, (void
*)&pVertices);
这是我用mesh创建地形网格的部分代码,创建到126*126的时候都可以,但是到128*128就会报错,而且定位到 m_pMesh->LockVertexBuffer(0, (void**)&pVertices);处,我发现之所有128*128出错是因为D3DXCreateMeshFVF的第二个参数超过65535,谁知道为什么吗?谢谢。

该回答引用ChatGPT-3.5

根据你提供的信息,问题可能是由于使用的索引缓冲区类型造成的。在DirectX中,使用16位索引缓冲区时,索引的最大数量是65535(2^16-1)。


在你的代码中,你使用了D3DXCreateMeshFVF函数创建网格,并指定了D3DXMESH_MANAGED标志来指示使用可管理的内存来存储网格数据。这个函数的第二个参数是网格的索引数量,你计算索引数量的方式是(nRows-1)*(nCols-1)*4


在网格的索引缓冲区中,每个四边形需要4个索引来定义其顶点。所以,你计算的索引数量是每个四边形有4个索引的情况下的总数。


然而,当你的地形网格的大小为128x128时,计算得到的索引数量超过了65535,导致创建网格失败。


解决这个问题的一种方法是使用32位索引缓冲区,它可以支持更大的索引数量。你可以尝试将索引缓冲区的类型更改为D3DXMESH_32BIT,如下所示:

D3DXCreateMeshFVF((nRows-1)*(nCols-1)*2, (nRows-1)*(nCols-1)*4, D3DXMESH_MANAGED | D3DXMESH_32BIT, TERRAINVERTEX::FVF, m_pd3dDevice, &m_pMesh);

这将使用32位索引缓冲区创建网格,从而允许你超过65535个索引。


请注意,使用32位索引缓冲区会消耗更多的内存,因为每个索引将使用4字节而不是2字节。确保你的系统具有足够的内存来容纳更大的索引缓冲区。