Qt и OpenGL: невозможно инициализировать VBO или VAO openGL после первого вызова PaintGL?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Qt и OpenGL: невозможно инициализировать VBO или VAO openGL после первого вызова PaintGL?

Сообщение Anonymous »

Я пишу программу, используя Qt5 и OpenGL. Это интерактивная 3D-среда, которая позволяет пользователю в любой момент импортировать несколько триангулированных сеток (помимо прочего). Изначально я использовал конвейер с фиксированными функциями, но узнал о шейдерах и хотел бы преобразовать их.
После того, как я преобразовал свой код для использования шейдеров, я столкнулся со странной проблемой, с которой мне пришлось столкнуться. не могу понять, что приведенный здесь пример кода воспроизводит настолько минимально, насколько это возможно:

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 

#define TEMP_ERR_CHK { GLenum err = glGetError(); std::cout glGenBuffers(1, &vboColors);
context->glBindBuffer(GL_ARRAY_BUFFER, vboColors);
context->glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(GLfloat), colors.data(), GL_STATIC_DRAW);
context->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
context->glEnableVertexAttribArray(1);

// Normal VBO
context->glGenBuffers(1, &vboNormals);
context->glBindBuffer(GL_ARRAY_BUFFER, vboNormals);
context->glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(GLfloat), normals.data(), GL_STATIC_DRAW);
context->glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
context->glEnableVertexAttribArray(2);

context->glBindVertexArray(0);

}

void draw()
{
std::cout glDrawArrays(GL_TRIANGLES, 0, 36);
context->glBindVertexArray(0);
}

private:
GLuint vao, vboPositions, vboColors, vboNormals;
QVector vertices, colors, normals;
float rotationAngle;
QOpenGLFunctions_3_3_Core* context;
};

class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core
{

public:
OpenGLWidget(QWidget* parent = nullptr)
: QOpenGLWidget(parent), program(nullptr), rotationAngle(24.0f) {}

virtual void mousePressEvent(QMouseEvent* event) override final
{
std::cout link();

// mesh_to_draw = new Mesh(this); //LOCATION 1
}

void paintGL() override {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

program->bind();

// Set up transformation matrices
QMatrix4x4 model;
model.rotate(rotationAngle, 0.0f, 1.0f, 0.0f);  // Rotate around Y axis

QMatrix4x4 view;
view.lookAt(QVector3D(0.0f, 0.0f, 3.0f), QVector3D(0.0f, 0.0f, 0.0f), QVector3D(0.0f, 1.0f, 0.0f));

QMatrix4x4 projection;
projection.perspective(45.0f, width() / float(height()), 0.1f, 100.0f);

program->setUniformValue("model", model);
program->setUniformValue("view", view);
program->setUniformValue("projection", projection);

program->setUniformValue("lightPosition", QVector3D(1.0f, 1.0f, 1.0f));
program->setUniformValue("viewPosition", QVector3D(0.0f, 0.0f, 3.0f));

if (mesh_to_draw) mesh_to_draw->draw();

program->release();
}

void resizeGL(int w, int h) override {
glViewport(0, 0, w, h);
}

private:
QOpenGLShaderProgram* program;
Mesh* mesh_to_draw = nullptr;
float rotationAngle;
};

int main(int argc, char *argv[]) {
QApplication app(argc, argv);
OpenGLWidget widget;
widget.setWindowTitle("Rotating Cube");
widget.resize(800, 600);
widget.show();
return app.exec();
}
Приведенный выше код содержит класс сетки, который содержит данные вершин, нормалей и цветов, а также vbos и vao, которые я использую для их рендеринга. Там есть функция, которая инициализирует эти объекты.
Существует класс виджета openGL, который обрабатывает рендеринг и который наследуется от QOpenGLWidget и QOpenGLFunctions_3_3_Core. Код содержит два места с комментариями: местоположение 0 и местоположение 1. Они представляют собой разные места, которые инициализируют различные ресурсы сетки. Инициализация в позиции 1 дает ожидаемый результат. Вижу треугольник на экране и все хорошо. Проблема в том, что мне приходится инициализировать сетку внутри функции InitializeGL, которая вызывается в начале программы. Я хочу иметь возможность добавлять сетку в произвольный момент во время выполнения. Чтобы имитировать это, я добавил mousePressEvent, который инициализирует сетку (местоположение 0). Однако, когда я инициализирую таким образом, я ничего не вижу на экране, а openGL выдает ошибку 1282 (недопустимая операция). Похоже, что при инициализации VAO после первого вызова отрисовки (или чего-то еще) VAO больше не действителен.
Для полноты, вот выходные данные терминала для каждого случая:
Место 1:

Код: Выделить всё

I AM INITIALIZING THE OPENGL
I AM INITIALIZING THE MESH VBOS
drawing
src/main.cpp 64:   OpenGL error code: 0
src/main.cpp 66:   OpenGL error code: 0
drawing
src/main.cpp 64:   OpenGL error code: 0
src/main.cpp 66:   OpenGL error code: 0
(треугольник отображается правильно)
Местоположение 0:

Код: Выделить всё

I AM INITIALIZING THE OPENGL
AAAA
I AM INITIALIZING THE MESH VBOS
drawing
src/main.cpp 64:   OpenGL error code: 0
src/main.cpp 66:   OpenGL error code: 1282
(на экране ничего)
Как это исправить?

Подробнее здесь: https://stackoverflow.com/questions/791 ... all-to-pai
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Qt и OpenGL: невозможно инициализировать OpenGL VBO или VAO после первого вызова PaintGL?
    Anonymous » » в форуме C++
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Невозможно отобразить полный VAO, если данные VBO были частично обновлены с помощью glBufferSubData().
    Anonymous » » в форуме Python
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Правильное использование vbo и vao [дубликат]
    Anonymous » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Иногда PaintGL в Qt не рисует границу OpenGL коллайдеров Bullet Physics.
    Гость » » в форуме C++
    0 Ответы
    34 Просмотры
    Последнее сообщение Гость
  • VAO не рендерится, OpenGL
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»