2016-10-28 45 views
1

我想在OpenGL中用三角形排序创建三角形网格。我有顶点缓冲区和索引缓冲区。我已经部分成功了,但是在屏幕截图中可以看到一半网格呈现错误。我不知道这是为什么。三角形网格,一半是错误的

enter image description here

我的代码是在这里

float[] vertices = new float[2 * rows * columns]; 

     int counter = 0; 
     for(int r = 0; r <rows; r++){ 
      for(int c = 0; c < columns; c++){ 
       vertices[counter ++] = (float)r/(rows-1); 
       vertices[counter ++] = (float)c/(columns -1);    
      } 
     } 

int[] indices = new int[4 * (rows) * (columns)]; 

     int counter = 0; 
     for(int r = 0; r < rows; r++){ 
      for(int c =0; c <= columns; c++){ 
       if(r % 2 == 0){ 
        if(c == columns){ 
         indices[counter ++] = (c-1) + (r+1)*columns; 
         indices[counter ++] = (c-1) + (r+1)*columns; 
        }else{ 
         indices[counter ++] = c + r * columns; 
         indices[counter ++] = c + (r+1) * columns; 
        } 
       }else{ 
        if(c == columns){ 
         indices[counter ++] = (columns) - c + (r +1) * columns; 
         indices[counter ++] = (columns) - c + (r +1) * columns; 
        }else{ 
         indices[counter ++] = (columns - 1) - c + (r + 1) * columns; 
         indices[counter ++] = r*columns + (columns-1) - c; 
        } 
       } 

      } 
     } 
+0

我建议你阅读关于原始重启索引。 – ybungalobill

回答

1

for (int r = 0; r < rows - 1; r++) {是你真正想要的东西。

您在使用(r+1)行时从r = 0循环到r = (rows - 1),实际上结束于不存在的以零填充的行。

所以这不是一个“网格的一半”,它只是最后一排三角形。

并且BTW,4 * rows * columns对于带之间具有2个附加退化三角形的三角形带索引列表来说太多了; 2 * (columns + 1) * (rows - 1)就足够了。

+0

非常感谢,它解决了这个问题,我真的没有意识到这个问题只在最后一行。 – Pogasta

+0

当然,感谢关于数组大小的提示。 – Pogasta