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 中使用顶点缓冲区对象绘制矩形?