Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to draw polygon with 3D points in modern openGL?

I know in 2.0- openGL we can draw a line simply like this.

glBegin(GL_LINES);  
glVertex3f(20.0f,150.0f,0.0f);  
glVertex3f(220.0f,150.0f,0.0f);  
glVertex3f(200.0f,160.0f,0.0f);  
glVertex3f(200.0f,160.0f,0.0f);  
glEnd();

but how to do similar thing in modern openGL(3.0+)

I have read Drawing round points using modern OpenGL but the answer is not about certain point,since I want to draw polygon with points have certain coordinates,it's not quite helpful.

I use this code,but it shows nothing except a blue background.what do I missed?

GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);

static const GLfloat g_vertex_buffer_data[] = {
        20.0f, 150.0f, 0.0f, 1.0f,
            220.0f, 150.0f, 0.0f, 1.0f,
            200.0f, 160.0f, 0.0f, 1.0f
    };

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

do{

    // Clear the screen
    glClear( GL_COLOR_BUFFER_BIT );

    // 1rst attribute buffer : vertices
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(
        0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        4,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
    );

    // Draw the triangle !
    glDrawArrays(GL_LINES, 0, 2); // 3 indices starting at 0 -> 1 triangle

    glDisableVertexAttribArray(0);

    // Swap buffers
    glfwSwapBuffers(window);


} // Check if the ESC key was pressed or the window was closed
while( glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&
       glfwWindowShouldClose(window) == 0 );
like image 789
Shihe Zhang Avatar asked Mar 04 '15 08:03

Shihe Zhang


People also ask

What kind of polygons can OpenGL draw?

OpenGL can render only convex polygons, but many nonconvex polygons arise in practice. To draw these nonconvex polygons, you typically subdivide them into convex polygons—usually triangles, as shown in Figure 2-12—and then draw the triangles.

What is polygon in OpenGL?

In computer graphics programming, an OpenGL polygon is a polygonal (multi-sided) shape drawn using the Open Graphics Library (OpenGL).


1 Answers

1) You have to define an array of vertices, that contain the points of your polygon lines. Like in your example:

GLfloat vertices[] =
{
    20.0f, 150.0f, 0.0f, 1.0f,
    220.0f, 150.0f, 0.0f, 1.0f,
    200.0f, 160.0f, 0.0f, 1.0f
};

2) You have to define and bind a Vertex Buffer Object (VBO) to be able to pass your vertices to the vertex shader. Like this:

// This is the identifier for your vertex buffer
GLuint vbo;
// This creates our identifier and puts it in vbo
glGenBuffers(1, &vbo);
// This binds our vbo
glBindBuffer(GL_ARRAY_BUFFER, vbo);
// This hands the vertices into the vbo and to the rendering pipeline    
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

3) Now we are ready to draw. Doing this:

// "Enable a port" to the shader pipeline
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
// pass information about how vertex array is composed
glVertexAttribPointer(0, // same as in glEnableVertexAttribArray(0)
                      4, // # of coordinates that build a vertex
                      GL_FLOAT, // data type
                      GL_FALSE, // normalized?
                      0,        // stride
                      (void*)0);// vbo offset

glDrawArrays(GL_LINES, 0, 2);
glDisableVertexAttribArray(0);

Step 1) and 2) can be done before rendering as initialization. Step 3) is done in your rendering loop. Also you'll need a vertex shader and a fragment shader to visualize the line with color.

If you don't know anything about these things and like to start with OpenGL 3, I'd suggest to start over with a tutorial like this: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-1-opening-a-window/

like image 89
Flupp Avatar answered Oct 10 '22 00:10

Flupp