在现代OpenGL中如何使用3D点绘制多边形?

5
我知道在2.0版本的OpenGL中,我们可以很简单地画一条直线,就像这样:

glBegin(GL_LINES);

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();

但是如何在现代OpenGL(3.0+)中做类似的事情呢?

我阅读了使用现代OpenGL绘制圆形点,但答案并不是关于特定点的,因为我想用具有特定坐标的点来绘制多边形,它并不是很有帮助。

我使用了这段代码,但除了一个蓝色背景外,什么也没有显示。我错过了什么吗?

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 );

2
这是完整的代码吗?你还需要着色器。 - Reto Koradi
着色器应该包含什么?@RetoKoradi - Shihe Zhang
着色器是用GLSL编写的程序。如果您想使用OpenGL核心配置文件,则需要提供自己的着色器。如果不这样做,下面接受的答案中的代码对您的目的来说确实是错误的。 - Reto Koradi
请阅读链接教程以了解“如何编写和使用着色器”:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/#Shaders。这里有你需要的一切。 - Flupp
1个回答

14

1)您需要定义一个顶点数组,其中包含多边形线的点。就像您的示例中一样:

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) 您需要定义并绑定一个顶点缓冲对象(VBO)才能将您的 vertices 传递给顶点着色器。就像这样:

// 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) 现在我们准备好绘制了。做法如下:

// "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);

第1步和第2步可以在渲染之前完成作为初始化。第3步在你的渲染循环中完成。此外,您需要一个顶点着色器和一个片段着色器来使用颜色可视化线条。

如果您对这些内容一无所知,并且希望从OpenGL 3开始学习,我建议您从像这样的教程开始:

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-1-opening-a-window/


只是想补充一下,如果您希望在任何时候更改构成形状的顶点,则需要重新缓冲顶点数据。我认为该方法的名称类似于 glBufferSubData - Benjamin James Drury
1
我使用了你的代码,但是它没有显示任何内容。你能看出我错过了什么吗? - Shihe Zhang
是的,他错过了什么?我刚刚尝试了一下,什么也没发生。 - blkpingu
实际上还有很多,这只覆盖了你需要了解的OpenGL 3.0渲染的一小部分。请按照这里的教程:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-1-opening-a-window/,你应该能够快速上手。 - Ian Young

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接