2016-12-06 1 views
3

У меня есть следующий класс, унаследованный от QOpenGLWidget и QOpenGLFunctions:Конфликт между шейдерами и QPainter в paintGL() для рендеринга 2D текст

class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions 
{ 
    Q_OBJECT 
public: 
    OpenGLWidget(); 
    virtual ~OpenGLWidget(); 

    void initializeGL(); 
    void paintGL() 
    { 
     QPainter painter(this); 

     painter.beginNativePainting(); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     // Calls OpenGL draw functions with VBOs 
     m_viewport.render(m_shader, m_entities); 
     painter.endNativePainting(); 

     painter.drawText(0, 0, width(), height(), Qt::AlignCenter, "Hello World!"); 

    } 
    void resizeGL(int width, int height); 

    [...] 
} 

«Hello World» рисуется, как задумано, но 3D сцена сломана. Я должен иметь 3D-ось в центре и в верхней правой части экрана:

enter image description here

Мне кажется, что вершина и фрагмент шейдеров я использую являются источником проблемы. В противном случае, учитывая простоту кода и примеры, которые я нашел, он должен работать.

Хороший результат будет:

enter image description here

с "Hello World" в центре. Это то, что я получаю, когда комментирую вызовы QPainter.

+0

Извините, как должен выглядеть «хороший» результат? – peppe

+0

См. Обновленный пост. –

+0

Что произойдет, если вы создадите QPainter после своего пользовательского кода рисования GL? – peppe

ответ

3

Кажется, что ваша программа шейдера освобождается при использовании QPainter. Свяжите программу шейдера перед вызовами OpenGL и отпустите ее позже. Он должен это исправить.

painter.beginNativePainting(); 
// Bind shader program 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
// Calls OpenGL draw functions with VBOs 
m_viewport.render(m_shader, m_entities); 
// Release shader program 
painter.endNativePainting(); 
Смежные вопросы