更新顶点并将它们发送到 GPU 的正确方法是什么?
What is is the correct way to update vertices and send them to GPU?
我试图用用户点击 QOpenGLWidget 的点绘制一条线带。如果我手动放置顶点并且不更新它们,它会按预期工作,但是如果我更新我的 Vertex 向量,它只会从小部件的中心到右中心绘制一条线,而不管顶点的位置。这是我的 updateVertices 方法(当用户点击小部件时调用):
void CurveGLWidget::updateVertices()
{
m_vao.bind();
m_vbo.bind();
m_vbo.allocate(vertices.size() * sizeof(Vertex));
m_vbo.write(0, &vertices.begin(), vertices.size() * sizeof(Vertex));
m_program.enableAttributeArray("position");
m_program.setAttributeBuffer("position", GL_FLOAT, 0, 2, sizeof(Vertex));
m_program.enableAttributeArray("color");
m_program.setAttributeBuffer("color", GL_FLOAT, sizeof(glm::vec2), 4, sizeof(Vertex));
m_vao.release();
m_vbo.release();
}
此时 m_vao 和 m_vbo 已经创建。
这是我的 paintGL 方法:
void CurveGLWidget::paintGL()
{
if (vertices.size() < 2) {
return;
}
updateVertices();
glClearColor(m_clearColor.r, m_clearColor.g, m_clearColor.b, m_clearColor.a);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
m_program.bind();
m_vao.bind();
glDrawArrays(GL_LINE_STRIP, 0, vertices.size());
m_vao.release();
m_program.release();
}
这是用户点击的示例:
V X Y
Vertex[ 0 ] = [ -0.715, 0.48 ]
Vertex[ 1 ] = [ -0.5175, 0.08 ]
Vertex[ 2 ] = [ -0.285, 0.426667 ]
Vertex[ 3 ] = [ -0.2, -0.153333 ]
Vertex[ 4 ] = [ -0.02, 0.64 ]
Vertex[ 5 ] = [ 0.1425, 0.05 ]
Vertex[ 6 ] = [ 0.2875, 0.696667 ]
Vertex[ 7 ] = [ 0.41, 0.03 ]
Vertex[ 8 ] = [ -0.485, -0.396667 ]
Vertex[ 9 ] = [ -0.015, -0.37 ]
Vertex[ 10 ] = [ 0.14, 0.316667 ]
谁能告诉我这段代码有什么问题?如何按需更新我的顶点?
可以找到完整的 CurveGLWidget 源代码 here。
我明白了。而不是 &vertices.begin()
我必须使用 &vertices.front()
.
我试图用用户点击 QOpenGLWidget 的点绘制一条线带。如果我手动放置顶点并且不更新它们,它会按预期工作,但是如果我更新我的 Vertex 向量,它只会从小部件的中心到右中心绘制一条线,而不管顶点的位置。这是我的 updateVertices 方法(当用户点击小部件时调用):
void CurveGLWidget::updateVertices()
{
m_vao.bind();
m_vbo.bind();
m_vbo.allocate(vertices.size() * sizeof(Vertex));
m_vbo.write(0, &vertices.begin(), vertices.size() * sizeof(Vertex));
m_program.enableAttributeArray("position");
m_program.setAttributeBuffer("position", GL_FLOAT, 0, 2, sizeof(Vertex));
m_program.enableAttributeArray("color");
m_program.setAttributeBuffer("color", GL_FLOAT, sizeof(glm::vec2), 4, sizeof(Vertex));
m_vao.release();
m_vbo.release();
}
此时 m_vao 和 m_vbo 已经创建。
这是我的 paintGL 方法:
void CurveGLWidget::paintGL()
{
if (vertices.size() < 2) {
return;
}
updateVertices();
glClearColor(m_clearColor.r, m_clearColor.g, m_clearColor.b, m_clearColor.a);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
m_program.bind();
m_vao.bind();
glDrawArrays(GL_LINE_STRIP, 0, vertices.size());
m_vao.release();
m_program.release();
}
这是用户点击的示例:
V X Y
Vertex[ 0 ] = [ -0.715, 0.48 ]
Vertex[ 1 ] = [ -0.5175, 0.08 ]
Vertex[ 2 ] = [ -0.285, 0.426667 ]
Vertex[ 3 ] = [ -0.2, -0.153333 ]
Vertex[ 4 ] = [ -0.02, 0.64 ]
Vertex[ 5 ] = [ 0.1425, 0.05 ]
Vertex[ 6 ] = [ 0.2875, 0.696667 ]
Vertex[ 7 ] = [ 0.41, 0.03 ]
Vertex[ 8 ] = [ -0.485, -0.396667 ]
Vertex[ 9 ] = [ -0.015, -0.37 ]
Vertex[ 10 ] = [ 0.14, 0.316667 ]
谁能告诉我这段代码有什么问题?如何按需更新我的顶点?
可以找到完整的 CurveGLWidget 源代码 here。
我明白了。而不是 &vertices.begin()
我必须使用 &vertices.front()
.