私は単純なポイントクラウドデータビューア(学習用)を開発しました。私はQtライブラリを使用しています。私の最初の実装ではQOpenGLWindowを使用しましたが、今はQOpenGLWidgetを使用して動的ライブラリなどを使用したいと考えています。QOpenGLWidgetは最初のペイントで正しく動作します
QOpenGLWidgetに関しては、最初の「ペインティング」(ウィジェットを作成するとPaintGLを呼び出す)だけで動作し、連続するpaintGL()呼び出しで何も起こりません。 この問題はQOpenGLWindowでは表示されず、完全に機能します。
マイPaintGL()私のクラスの次のメソッドを使用してペイント:
:「オブジェクト」は私のapplicacionでのOpenGLのオブジェクトを定義するローカル構造体のSTD ::ベクトルである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();
}
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();
}