c++openglgeometryplanegl-triangle-strip

Generate a plane with triangle strips


What would be the best algorithm to generate a list of vertices to draw a plane using triangle strips?

I'm looking for a function which receives the plane's width and height and returns a float array containing correctly indexed vertices.

width represents the number of vertices per row.

height represents the number of vertices per column.

float* getVertices( int width, int height ) {
    ...
}

void render() {
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, getVertices(width,heigth));
    glDrawArrays(GL_TRIANGLE_STRIP, 0, width*height);
    glDisableClientState(GL_VERTEX_ARRAY);
}

Solution

  • Thanks you all. I've coded this. Is it correct? Or is the generated strip somehow wrong?

    int width;
    int height;
    float* vertices = 0;
    int* indices = 0;
    
    int getVerticesCount( int width, int height ) {
        return width * height * 3;
    }
    
    int getIndicesCount( int width, int height ) {
        return (width*height) + (width-1)*(height-2);
    }
    
    float* getVertices( int width, int height ) {
        if ( vertices ) return vertices;
    
        vertices = new float[ getVerticesCount( width, height ) ];
        int i = 0;
    
        for ( int row=0; row<height; row++ ) {
            for ( int col=0; col<width; col++ ) {
                vertices[i++] = (float) col;
                vertices[i++] = 0.0f;
                vertices[i++] = (float) row;
            }
        }
    
        return vertices;
    }
    
    int* getIndices( int width, int height ) {
        if ( indices ) return indices;
    
        indices = new int[ iSize ];
        int i = 0;
    
        for ( int row=0; row<height-1; row++ ) {
            if ( (row&1)==0 ) { // even rows
                for ( int col=0; col<width; col++ ) {
                    indices[i++] = col + row * width;
                    indices[i++] = col + (row+1) * width;
                }
            } else { // odd rows
                for ( int col=width-1; col>0; col-- ) {
                    indices[i++] = col + (row+1) * width;
                    indices[i++] = col - 1 + + row * width;
                }
            }
        }
        if ( (mHeight&1) && mHeight>2 ) {
            mpIndices[i++] = (mHeight-1) * mWidth;
        }
    
        return indices;
    }
    
    void render() {
        glEnableClientState( GL_VERTEX_ARRAY );
        glVertexPointer( 3, GL_FLOAT, 0, getVertices(width,height) );
        glDrawElements( GL_TRIANGLE_STRIP, getIndicesCount(width,height), GL_UNSIGNED_INT, getIndices(width,height) );
        glDisableClientState( GL_VERTEX_ARRAY );
    }
    

    With width=4 and height=4 this is what I got: enter image description here

    And here I'm modifying some vertex height: enter image description here