[РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Модератор: Модераторы разделов
[РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Доброго дня!
Использую qt-5.5.1 x86, для быстрого отображения изображения создал дочерний класс от QOpenGLWidget и определил в нём функции initializeGL, painGL и resizeGL.
В главное окно приложения добавил QWidget и перевёл его в мой класс наследующий от QOpenGLWidget.
В принципе изображение выводится, но оно выводится не в виджете, а поверх всего приложения, выглядит это как постоянное переключение между отображением изображения и окна приложения.
Вопрос - как заставить выводить изображение в QOpenGLWidget, а не поверх всего приложения.
Спасибо.
Использую qt-5.5.1 x86, для быстрого отображения изображения создал дочерний класс от QOpenGLWidget и определил в нём функции initializeGL, painGL и resizeGL.
В главное окно приложения добавил QWidget и перевёл его в мой класс наследующий от QOpenGLWidget.
В принципе изображение выводится, но оно выводится не в виджете, а поверх всего приложения, выглядит это как постоянное переключение между отображением изображения и окна приложения.
Вопрос - как заставить выводить изображение в QOpenGLWidget, а не поверх всего приложения.
Спасибо.
- Stauffenberg
- Сообщения: 2042
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Тут будет тяжело сказать что-то конкретное пока не увидим код.
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)
"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)
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Код: Выделить всё
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)
{}
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Тут как раз всё понятно. Интереснее как вы его используете. Не забыли ли отдать под управление какого либо layout - без этого любой виджет будет выводить куда попало.
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
А что не так, вроде работает.
Ну, не считая странного вызова glDrawArrays.
PS
Или получаете чёрное окно и сообщения в логах (libGL error)? NVidia? Тогда нужно убрать переменную GL_LIBRARY_PATH из конфига QtCreator (Projects → Build&Run → Run).
Ну, не считая странного вызова glDrawArrays.
PS
Или получаете чёрное окно и сообщения в логах (libGL error)? NVidia? Тогда нужно убрать переменную GL_LIBRARY_PATH из конфига QtCreator (Projects → Build&Run → Run).
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
widget расположен на mainwindow, собственно он там единственный, на всё mainwindows применяется горизонтальное выравнивание
Работает, но выводит поверх mainwindow, а не в самом виджете
Почему странного? Мне нужно следующее - вывести несколько изображений друг за другом расположив их в одну линию, этакая панорама.
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
IMB
Ну, наверное с glDrawArrays Вы что-то не скопировали, потому что glDrawArrays не работает непосредственно с текстурами, но массивами, а у Вас не приведён код, который бы устанавливал такие массивы.
Ну, а в остальном, код нормально работает. Вывел какую-то ересь как текстуру в обычный quad:
Ну, наверное с glDrawArrays Вы что-то не скопировали, потому что glDrawArrays не работает непосредственно с текстурами, но массивами, а у Вас не приведён код, который бы устанавливал такие массивы.
Ну, а в остальном, код нормально работает. Вывел какую-то ересь как текстуру в обычный quad:
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Я не совсем Вас понимаю.
Текстуры я храную в массиве _texture, заполняю его в функции GLWidget::add(QImage image, quint8 pos).
Не затруднит ли Вас привести пример кода для вывода текстур из массива?
P.S. Может быть Вы прикрепите архив с кодом Вашей тестовой программы?
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Вот.
Вариант с использованием нескольких текстур для glDrawArrays не лучший вариант. В случае одной текстуры можно было б одним вызовом всё нарисовать.
Вариант с использованием нескольких текстур для glDrawArrays не лучший вариант. В случае одной текстуры можно было б одним вызовом всё нарисовать.
Спасибо сказали:
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
Не затруднит ли разъяснить некоторые моменты:
- txcoords, насколько я понимаю, это координаты четырёх углов текстуры, vertecies также похоже на координаты, но зачем они нужны?
- везде используется число 4, насколько я понимаю это связано с тем, что используется 2D текстура с четырьма углами, но почему при генерации координат везде используется множитель 2?
- полоса для вывода имеет белый цвет, хотя в initializeGL() выставлено использовать чёрный (glClearColor(0, 0, 0, 1)), как можно регулировать её цвет
Спасибо.
- txcoords, насколько я понимаю, это координаты четырёх углов текстуры, vertecies также похоже на координаты, но зачем они нужны?
- везде используется число 4, насколько я понимаю это связано с тем, что используется 2D текстура с четырьма углами, но почему при генерации координат везде используется множитель 2?
- полоса для вывода имеет белый цвет, хотя в initializeGL() выставлено использовать чёрный (glClearColor(0, 0, 0, 1)), как можно регулировать её цвет
Спасибо.
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
txcoords - это координаты на самой текстуре, а vertecies - вершины многоугольника в пространстве.
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Опыт - это когда все получается с первого раза.
Re: [РЕШЕНО] qt: OpenGL выводит поверх всего приложения
1. Да, txcoords — это координаты текстур для соответствующих вершин. vertecies — это координаты вершин в мире (сцене). Ну, чтобы что-то нарисовать, надо сообщить, где его рисовать, вот это и задаётся в данном массиве.
2.
4 — да, потому что используются 4-угольники.
2 — количество измерений на вершину (x,y для вершин, s,t — для текстур)
3. glClearColor задаёт цвет очистки буфера. Для вершин цвет задаётся отдельно. Ну, и данный цвет микшируется с цветом текстуры, поэтому, если задать просто чёрный цвет для всех вершин, то чёрным будет всё.
2.
4 — да, потому что используются 4-угольники.
2 — количество измерений на вершину (x,y для вершин, s,t — для текстур)
3. glClearColor задаёт цвет очистки буфера. Для вершин цвет задаётся отдельно. Ну, и данный цвет микшируется с цветом текстуры, поэтому, если задать просто чёрный цвет для всех вершин, то чёрным будет всё.