fjfhnnhy 2013-11-30 13:22 采纳率: 0%
浏览 867

使用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,谁知道为什么吗?谢谢。

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-05-26 22:19
    关注

    该回答引用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字节。确保你的系统具有足够的内存来容纳更大的索引缓冲区。

    评论

报告相同问题?

悬赏问题

  • ¥15 计算二重积分∫∫e^(x+y)dxdy,其中0≤x≤1,0≤y≤1,试分别用复合辛普森公式(取n=4)以及高斯求积公式(取n=4)计算积分 给出matlab程序
  • ¥15 opencv 无法读取视频
  • ¥15 用matlab 实现通信仿真
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的