繁体   English   中英

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

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

我知道在 2.0-openGL 中我们可以像这样画一条线。

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

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 -打开一个窗口/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM