[РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Модератор: Модераторы разделов

Ответить
IMB
Сообщения: 2561
ОС: Debian

[РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение IMB »

Доброго дня!
Использую qt-5.5.1 x86, для быстрого отображения изображения создал дочерний класс от QOpenGLWidget и определил в нём функции initializeGL, painGL и resizeGL.
В главное окно приложения добавил QWidget и перевёл его в мой класс наследующий от QOpenGLWidget.
В принципе изображение выводится, но оно выводится не в виджете, а поверх всего приложения, выглядит это как постоянное переключение между отображением изображения и окна приложения.
Вопрос - как заставить выводить изображение в QOpenGLWidget, а не поверх всего приложения.
Спасибо.
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение Stauffenberg »

Тут будет тяжело сказать что-то конкретное пока не увидим код.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
IMB
Сообщения: 2561
ОС: Debian

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение IMB »

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

GLWidget::GLWidget(QWidget *parent) :
    QOpenGLWidget(parent)
{}

GLWidget::~GLWidget()
{
    glDeleteTextures(CHANNEL_MAX, _texture);
}

void GLWidget::add(QImage image, quint8 pos)
{
    if (pos < CHANNEL_MAX) {
        qDebug() << func << "add position" << pos;
        glActiveTexture(GL_TEXTURE0 + pos);
        glBindTexture(GL_TEXTURE_2D, _texture[pos]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.constBits());
        update();
    }
}

void GLWidget::initializeGL()
{
    initializeOpenGLFunctions();
    glClearColor(0, 0, 0, 1);
    glEnable(GL_TEXTURE_2D);
    glGenTextures(CHANNEL_MAX, _texture);
}

void GLWidget::paintGL()
{
    qDebug() << func;
    glDrawArrays(GL_TEXTURE_2D_ARRAY, _texture[0], CHANNEL_MAX);
}

void GLWidget::resizeGL(int w, int h)
{}
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение s.xbatob »

Тут как раз всё понятно. Интереснее как вы его используете. Не забыли ли отдать под управление какого либо layout - без этого любой виджет будет выводить куда попало.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение NickLion »

А что не так, вроде работает.

Ну, не считая странного вызова glDrawArrays.

PS
Или получаете чёрное окно и сообщения в логах (libGL error)? NVidia? Тогда нужно убрать переменную GL_LIBRARY_PATH из конфига QtCreator (Projects → Build&Run → Run).
Спасибо сказали:
IMB
Сообщения: 2561
ОС: Debian

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение IMB »

s.xbatob писал(а):
07.11.2015 12:52
Интереснее как вы его используете. Не забыли ли отдать под управление какого либо layout - без этого любой виджет будет выводить куда попало.

widget расположен на mainwindow, собственно он там единственный, на всё mainwindows применяется горизонтальное выравнивание


NickLion писал(а):
07.11.2015 13:00
А что не так, вроде работает.

Работает, но выводит поверх mainwindow, а не в самом виджете
NickLion писал(а):
07.11.2015 13:00
Ну, не считая странного вызова glDrawArrays.

Почему странного? Мне нужно следующее - вывести несколько изображений друг за другом расположив их в одну линию, этакая панорама.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение NickLion »

IMB
Ну, наверное с glDrawArrays Вы что-то не скопировали, потому что glDrawArrays не работает непосредственно с текстурами, но массивами, а у Вас не приведён код, который бы устанавливал такие массивы.

Ну, а в остальном, код нормально работает. Вывел какую-то ересь как текстуру в обычный quad:
qt5gl.png
Спасибо сказали:
IMB
Сообщения: 2561
ОС: Debian

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение IMB »

NickLion писал(а):
07.11.2015 22:07
Ну, наверное с glDrawArrays Вы что-то не скопировали, потому что glDrawArrays не работает непосредственно с текстурами, но массивами, а у Вас не приведён код, который бы устанавливал такие массивы.

Я не совсем Вас понимаю.
Текстуры я храную в массиве _texture, заполняю его в функции GLWidget::add(QImage image, quint8 pos).
Не затруднит ли Вас привести пример кода для вывода текстур из массива?

P.S. Может быть Вы прикрепите архив с кодом Вашей тестовой программы?

Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение NickLion »

Вот.
test_qt5gl.tar.gz
(4.85 КБ) 11 скачиваний


Вариант с использованием нескольких текстур для glDrawArrays не лучший вариант. В случае одной текстуры можно было б одним вызовом всё нарисовать.
Спасибо сказали:
IMB
Сообщения: 2561
ОС: Debian

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение IMB »

Не затруднит ли разъяснить некоторые моменты:
- txcoords, насколько я понимаю, это координаты четырёх углов текстуры, vertecies также похоже на координаты, но зачем они нужны?
- везде используется число 4, насколько я понимаю это связано с тем, что используется 2D текстура с четырьма углами, но почему при генерации координат везде используется множитель 2?
- полоса для вывода имеет белый цвет, хотя в initializeGL() выставлено использовать чёрный (glClearColor(0, 0, 0, 1)), как можно регулировать её цвет
Спасибо.
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 850
Статус: Оператор вычислительных машин
ОС: Debian

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение Janik »

txcoords - это координаты на самой текстуре, а vertecies - вершины многоугольника в пространстве.
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения

Сообщение NickLion »

1. Да, txcoords — это координаты текстур для соответствующих вершин. vertecies — это координаты вершин в мире (сцене). Ну, чтобы что-то нарисовать, надо сообщить, где его рисовать, вот это и задаётся в данном массиве.
2.
4 — да, потому что используются 4-угольники.
2 — количество измерений на вершину (x,y для вершин, s,t — для текстур)
3. glClearColor задаёт цвет очистки буфера. Для вершин цвет задаётся отдельно. Ну, и данный цвет микшируется с цветом текстуры, поэтому, если задать просто чёрный цвет для всех вершин, то чёрным будет всё.
Спасибо сказали:
Ответить