【问题标题】:DirectX 9 Terrain genereration C++DirectX 9 地形生成 C++
【发布时间】:2015-04-05 13:49:03
【问题描述】:

我在生成带有四边形的平坦地形时遇到问题,我认为四边形的位置正确但索引不正确。有人可以看看并告诉我我做错了什么或如何解决它吗?基本上显示了地形,但完全错误。我认为这是索引定位,请帮助我,将不胜感激。

FOR 循环:

    for(int i = 0; i < NUM_VERTS; i += 4){
    for(int x = 0; x < j; x ++){
        for(int z = 0; z < j; z ++){
            verts[i] = D3DVertex::VertexPositionNormalTexture(x, -1.0f, z+1, n, 1.0f, g, 0.0f, 0.0f);
            verts[i+1] = D3DVertex::VertexPositionNormalTexture(x+1, -1.0f, z+1, n, 1.0f, g, 1.0f, 0.0f);
            verts[i+2] = D3DVertex::VertexPositionNormalTexture(x, -1.0f, z, n, 1.0f, g, 0.0f, 1.0f);
            verts[i+2] = D3DVertex::VertexPositionNormalTexture(x+1, -1.0f, z, n, 1.0f, g, 0.0f, 1.0f);
            indices[i] = i;
            indices[i+1] = i+1;
            indices[i+2] = i+2;
            indices[i+3] = i+2;
            indices[i+4] = i+1;
            indices[i+5] = i+3;
        }
    }
    //MessageBox(NULL, L"Test", NULL, NULL);
}

【问题讨论】:

  • 您的实际问题是什么?
  • 我的代码有什么问题,我怎样才能正确排列索引,使其成为四边形地形。 NUM_VERTS = 24 和 NUM_INDECES = 36

标签: c++ directx terrain


【解决方案1】:

您的最外层循环没有意义。相反,为顶点缓冲区和索引缓冲区维护两个索引,如下所示:

int iVertex = 0;
int iIndex = 0;
for(int x = 0; x < j; x ++){
    for(int z = 0; z < j; z ++){
        verts[iVertex  ] = D3DVertex::VertexPositionNormalTexture(x, -1.0f, z+1, n, 1.0f, g, 0.0f, 0.0f);
        verts[iVertex+1] = D3DVertex::VertexPositionNormalTexture(x+1, -1.0f, z+1, n, 1.0f, g, 1.0f, 0.0f);
        verts[iVertex+2] = D3DVertex::VertexPositionNormalTexture(x, -1.0f, z, n, 1.0f, g, 0.0f, 1.0f);
        verts[iVertex+3] = D3DVertex::VertexPositionNormalTexture(x+1, -1.0f, z, n, 1.0f, g, 0.0f, 1.0f);
        indices[iIndex  ] = iVertex;
        indices[iIndex+1] = iVertex+1;
        indices[iIndex+2] = iVertex+2;
        indices[iIndex+3] = iVertex+2;
        indices[iIndex+4] = iVertex+1;
        indices[iIndex+5] = iVertex+3;

        iVertex += 4;
        iIndex += 6;
    }
}

我假设您知道地形会在xz 方向上从0 延伸到j + 1

如果它只是一个平面,您也可以考虑使用单个四边形。如果您需要多个三角形,您可以考虑将三角形列表转换为三角形条。如果你想坚持三角形列表,你至少应该考虑删除重复的顶点(地形中心的每个顶点存在四次)。

【讨论】:

  • 是的,我知道它会伸展,这就是问题所在,我不知道如何创建地形,您能帮帮我吗?并解释原因。感谢您提供有关循环的提示,并感谢您的快速回复。
  • 哦,是的,j = num_verts/2 得到一个乡绅,但我假设它计算错误
  • 如果你的顶点数是固定的,你应该计算j = sqrt(num_verts / 4)。确保这将产生一个自然数。
  • 好的,我试一试,如何创建四边形地形?您是否有教程或示例链接,我现在搜索了一周但找不到任何东西,我找到了一个 directx 11 示例,但是将我的项目转换为 directx 11 需要做很多工作
  • *** 谢谢!!!索引仍然有一些错误,纹理似乎在每个四边形的右下角被拉伸,我该如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多