我開發了一個簡單的點雲數據查看器(僅用於學習),我正在使用Qt庫。我的第一個實現使用QOpenGLWindow,但現在我想使用QOpenGLWidget來使用它,例如動態庫。QOpenGLWidget只能在第一個油漆中正常工作
關於QOpenGLWidget,它只是在第一個「繪畫」(在創建窗口小部件時調用PaintGL)以及在連續的paintGL()調用中沒有任何反應。 這個問題不會出現在QOpenGLWindow中,它完美的工作。
我PaintGL()油漆使用我的課的下一個方法:
void AEOpenGLViewer::renderGL() {
// Clear
glClear(GL_COLOR_BUFFER_BIT);
shader_program->bind();
shader_program->setUniformValue(u_worldToCamera, camera.toMatrix());
shader_program->setUniformValue(u_cameraToView, projection);
{
for (size_t globjects_index = 0; globjects_index < objects.size(); ++globjects_index) {
objects.at(globjects_index).vao->bind();
shader_program->setUniformValue(u_modelToWorld, objects.at(globjects_index).transform.toMatrix());
glDrawArrays(objects.at(globjects_index).primitive_type, 0, objects.at(globjects_index).vertices.size());
objects.at(globjects_index).vao->release();
}
}
shader_program->release();
}
其中「對象」是一個局部結構,在我的applicacion定義OpenGL的物體的一個std ::向量:
typedef struct {
QOpenGLBuffer *vbo;
QOpenGLVertexArrayObject *vao;
GLenum primitive_type;
std::vector<Vertex> vertices;
Transform3D transform;
} GLObject;
爲了降低GPU負載,使用輸入事件(KeyPressEvent,MouseMoveEvent ..)調用插槽「update()」。
如果有人有興趣,在VBO分配如下:
void AEOpenGLViewer::prepareObjectInGPU(GLObject globject) {
shader_program->bind();
{
// Create Buffer (Do not release until VAO is created) (vbo)
globject.vbo->create();
globject.vbo->bind();
globject.vbo->setUsagePattern(QOpenGLBuffer::StaticDraw);
globject.vbo->allocate(globject.vertices.data(), globject.vertices.size() * sizeof(Vertex));
// Create Vertex Array Object (vao)
globject.vao->create();
globject.vao->bind();
shader_program->enableAttributeArray(0);
shader_program->enableAttributeArray(1);
shader_program->setAttributeBuffer(0, GL_FLOAT, Vertex::positionOffset(), Vertex::PositionTupleSize, Vertex::stride());
shader_program->setAttributeBuffer(1, GL_FLOAT, Vertex::colorOffset(), Vertex::ColorTupleSize, Vertex::stride());
// Release (unbind) all
globject.vbo->release();
globject.vao->release();
}
shader_program->release();
}