OpenGL:如何在 Qt 中使用 glMapBuffer?

Posted

技术标签:

【中文标题】OpenGL:如何在 Qt 中使用 glMapBuffer?【英文标题】:OpenGL : How to use glMapBuffer with Qt? 【发布时间】:2016-07-26 09:39:39 【问题描述】:

我正在尝试将 glMapBuffer 与 QOpenGLWidget 一起使用,但我找不到它。这是我包含的文件:

#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLBuffer>
#include <QDebug>
#include <QOpenGLTexture>
#include <GL/gl.h>
#include <GL/glext.h>
#include <QGLFunctions>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>

【问题讨论】:

【参考方案1】:

您不应该混合使用 QOpenGL 和 QGL(在项目配置中删除 QGLFunctions 等旧的、已弃用的 OpenGL 模块)。您不需要包含 gl.h 和 glext.h。

您包含 QOpenGLBuffer。 map()方法封装了glMapBuffer:

// creation

QOpenGLBuffer buffer = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
buffer->create();

// allocation

buffer->bind();

buffer->allocate(size_of_the_buffer);

buffer->release();

// update

buffer->bind();

void* buffer_data = buffer->map(QOpenGLBuffer::WriteOnly);

memcpy(buffer_data, your_data_to_copy, size_of_your_data_to_copy);

buffer->unmap();

buffer->release();

【讨论】:

map() 方法适用于 QOpenGLBuffer 对象,但我将 glBuffer 用于我的 VBO。我需要更改它,但我不知道该怎么做。 VBO 和其他的一样是一个 OpenGL 缓冲区:使用 QOpenGLBuffer 来管理它。我用一个例子编辑我的答案 好的,你的例子更好,但我还有问题。在您的示例中,glBufferSubData 的等价物是什么?是否需要为第一次数据传输更新它?它如何与 glVertexAttribPointer 一起使用?我如何操作偏移,因为我在缓冲区中传递顶点和纹理坐标数据。 对于 glBufferSubData 的等价物,您可以使用write()。您可以使用overload to allocate() 进行首次数据传输。 glVertexAttribPointer,应该通过QOpenGLShaderProgram使用,如果数据是交错的,它有一个stride参数。偏移量由值的“地址”隐式给出

以上是关于OpenGL:如何在 Qt 中使用 glMapBuffer?的主要内容,如果未能解决你的问题,请参考以下文章

QT和OpenGL如何正确集成并显示纹理

如何在带有 Qt 的 OpenGL 中使用顶点缓冲区对象绘制矩形?

Qt & OpenGL:如何尽可能频繁地渲染?

Qt & OpenGL:如何强制使用 OpenGL 2.1?

如何在Qt中配置OpenGL

如何在 Qt 表单类中调整 OpenGL 小部件的大小