三角网格,一半是错误的

时间:2016-10-28 11:45:37

标签: opengl grid

我正在尝试在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;
                    }
                }

            }
        }

1 个答案:

答案 0 :(得分: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)就足够了。