gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:30:52 26 4
gpt4 key购买 nike

我知道在 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+) 中做类似的事情

我已阅读Drawing round points using modern 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) 您必须定义并绑定(bind)顶点缓冲区对象 (VBO),才能将您的顶点 传递到顶点着色器。像这样:

// 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/

关于c++ - 如何在现代openGL中用3D点绘制多边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28849321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com