OpenGL平面索引计算

时间:2014-04-27 18:29:21

标签: opengl indexing geometry terrain

我有一个问题,过去几天我一直在疯狂,我不知道我在这里做错了什么。我写了一些代码,它应该为由三角形组成的平面生成索引。平面分为四边形,四边形又由两个三角形组成 - 每个四边形有6个指数。

这就是代码的样子:

function TaeTerrainTile.GenerateLODIndexBuffer(gbo: TaeGraphicsBufferObject; tile_size, tile_res: integer): integer;
var
  neededIndices: word;
  i_row, i_col: integer;
  i_top_left, i_bottom_right: word;
begin
  // calculate needed indices
  neededIndices := (tile_size div tile_res) * (tile_size div tile_res) * 2 * 3;
  gbo.PreallocateIndices(neededIndices);

  i_col := 0;
  i_row := 0;
  while i_col < (tile_size div tile_res) -1 do
  begin
    while i_row < (tile_size div tile_res) -1 do
    begin


      // top left vertex
      i_top_left := (i_col * tile_size * tile_res) + (i_row * tile_res);
      gbo.addIndex(i_top_left);

      // bottom right vertex
      i_bottom_right := i_top_left + tile_size * tile_res + tile_res;
      gbo.addIndex(i_bottom_right);

      // top right vertex
      gbo.addIndex(i_top_left + tile_res);


      // bottom triangle

      // top left vertex
      gbo.addIndex(i_top_left);
      // bottom left vertex
      gbo.addIndex(i_top_left + tile_size * tile_res);
      // bottom right vertex
      gbo.addIndex(i_bottom_right);

      inc(i_row);
    end;

    i_row := 0;
    inc(i_col);

  end;
end;

它产生看起来几乎完美的指数:

Good

现在,您可能会看到每个四边形中缺少行和列 - 为此,我想在上面的代码中删除两个while循环中的两个“减1”。

如果我这样做,就产生了这个:

Bad

我在嘲笑为什么会这样,但却找不到原因。有人看到我的问题吗?

编辑:我知道必须有一些索引超出范围,但我看不出上面的公式有什么问题。

Edit2:顶点的数据布局是基于网格的,这里是处理它的代码:

  for y := 0 to AE_TERRAIN_TILE_SIZE - 1 do
  begin
    v[2] := ty + y;
    for x := 0 to AE_TERRAIN_TILE_SIZE - 1 do
    begin
      v[0] := tx + x;
      v[1] := Self._GetHeightCall(v[0], v[2]);
      gbo_high.addVertex(v);
    end;
  end;

0 个答案:

没有答案