Как использовать QPainter и OpenGL с шейдерами параллельно с Qt5.9 - PullRequest
0 голосов
/ 11 апреля 2019

Я видел много вопросов о том, как использовать OpenGL с шейдерами и QPainter параллельно на QOpenGLWidget. Например Пример 1 , Пример 2 и Пример 3 .

Я обнаружил, что при использовании QPainter, собственного кода OpenGL и шейдеров возникает очень много проблем. Иногда рендерится только материал QPainter, иногда рендерится только материал, хранящийся в VertexArrayObjects, или рендерится материал, использующий «старые пути» для установки вершин с glVertex().

Мне удалось создать очень маленькое решение, которое изменяет только использование QPainter для параллельного использования каждых 3 методов рисования.

В результате вы можете использовать QPainter и шейдер везде в вашей paintGL() -пайплайн QOpenGLWidget, где вы хотите, без изменения каждый раз ваших состояний OpenGL или запуска и завершения nativePainting с вашим QPainter.

1 Ответ

0 голосов
/ 11 апреля 2019

Таким образом, решение состояло в том, чтобы создать собственный класс QPainter с именем MyPainter, который наследуется от QPainter.

class MyPainter : public QPainter {

public:
    MyPainter(QPaintDevice* device, ShaderProgram* sp);
    bool end();

private:
    ShaderProgram* shaderProgram;
};

В этом классе вы переопределяете end () - метод QPainter и реализуете его следующим образом:

 MyPainter::MyPainter(QPaintDevice* device, ShaderProgram* sp)
: QPainter(device), shaderProgram(sp) {
}

bool MyPainter::end() {
    beginNativePainting();
    bool b = shaderProgram->bind();
    return b;
}

Сначала вам нужно beginNativePainting()опять же, когда QPainter заканчивается после рисования чего-либо, а затем вам нужно снова связать текущую шейдерную программу.Обратите внимание, что ShaderProgram в этом примере является унаследованным классом QOpenGLShaderProgram.
Теперь используйте этот MyPainter вместо QPainter в вашем QOpenGLWidget классе в методе paintGL(), и все должно работать нормально, и вы можетевызывать функции OpenGL и QPainter методы в любое время.
Это решение было протестировано с Qt5.9.1, с Visual Studio 2015 и Windows 7.
Если что-то не работает, может быть, вы могли бы привести пример, что делаетне работает и как вы используете QPainter и OpenGL.Меня очень интересует «правильный» способ параллельного использования QPainter и OpenGL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...