После того, как я преобразовал свой код для использования шейдеров, я столкнулся со странной проблемой, с которой мне пришлось столкнуться. не могу понять, что приведенный здесь пример кода воспроизводит настолько минимально, насколько это возможно:
Код: Выделить всё
#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();
}
Существует класс виджета 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