LINUX.ORG.RU

Qt + OpenGl + Intel


0

3

Изучаю сейчас OpenGL и в один прекрасный момент сменил один из компов на свежий на интел со встройкой. Во время переноса проекта на Qt на новую машину заметил проблему с отрисовкой окна при старте приложения.

В compatibility profile все работает на ура, но стоит включить core profile и при старте приложение окно не обновляется до того момента, как я добавлю туда любой объект (захватывается кусок экрана, где возникло окно).

Кто нибудь встречался с подобным? Если да, то как лечили?

Вот код с которым у меня воспроизводиться баг (код брался для примера. На рабочем коде для core тоже самое):

class GLWidget : public QGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT
public:
    explicit GLWidget(QWidget *parent = 0);
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
signals:

public slots:

};
GLWidget::GLWidget(QWidget *parent) :
    QGLWidget(parent)
{
}
void GLWidget::initializeGL() {

    QGLFormat format;
    format.setVersion(4,3);
    format.setProfile(QGLFormat::CompatibilityProfile);
    this->setFormat(format);
    /*glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glShadeModel(GL_SMOOTH);*/
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    // Dark blue background
    glClearColor(0.0f, 0.0f, 0.4f, 0.0f);

    // Enable depth test
    glEnable(GL_DEPTH_TEST);
    // Accept fragment if it closer to the camera than the former one
    glDepthFunc(GL_LESS);

}
const GLfloat triangleVertices[] {
   -1.0f, -0.5f, 0.0f,
     1.0f, -0.5f, 0.0f,
     0.0f,  0.5f, 0.0f
};

void GLWidget::resizeGL(int w, int h)
{
    if (h == 0) {
        h = 1;
    }

    glViewport( 0, 0, w, qMax( h, 1 ) );
 }


void GLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    //glColor3f(1.0f, 0.0f, 0.0f);
    glColor4f(0.0f,1.0f,0.0f,0.0f);
    glEnableClientState(GL_VERTEX_ARRAY);
    {

        glVertexPointer(3, GL_FLOAT, 0, triangleVertices);
        glDrawArrays(GL_TRIANGLE_FAN, 0, 3);

    }
    glDisableClientState(GL_VERTEX_ARRAY);

}

Выхлоп archey:

OS: Arch Linux x86_64  
Kernel Release: 3.13.6-1-ARCH  
DE: KDE
RAM: 1555 MB / 3827 MB
Processor Type: Intel(R) Core(TM) i3-4130 CPU @ 3.40GHz 
Выхлоп glxinfo:
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Haswell 
OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.1.0
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 10.1.0
OpenGL shading language version string: 1.30
OpenGL context flags: (none)

Т.е. окно показывает кусок рабочего стола до тех пор, пока вы что-нибудь в нем не нарисуете? Это нормально.

trex6 ★★★★★
()

Разве у glClearColor(0.0f, 0.0f, 0.4f, 0.0f); последний аргумент alpha не должен быть равен 1.0f? Иначеж оно прозрачное поидее будет.

RevenantX ★★★★
()
Последнее исправление: RevenantX (всего исправлений: 1)
Ответ на: комментарий от trex6

Этот же код на нвидиа/радеоне (проприетарные дрова с арчем и винда) выводят треугольник на черном фоне. На машине с арчем и интелом у меня показывает кусок рабочего стола. Вызов paintGL не помогает и рисоваться начинает, только после того как в шейдер попадает хотя бы одна вершина (данный пример без шейдеров, но нормально отрабатывает под виндой с core profile).

ImperialDwarf
() автор топика
Ответ на: комментарий от RevenantX

Пробовал изменять на 1.0f, но эффекта нету ни на одной машине.

ImperialDwarf
() автор топика
Ответ на: комментарий от ImperialDwarf

Действительно похоже на проблему в драйверах.

Багрепорт в интел с минимальным workaround составлен?

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Пока еще не делал. Сейчас экспериментирую с кодом.

ImperialDwarf
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.