Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: __Heaven__ от Март 26, 2015, 14:23



Название: [РЕШЕНО] Использование QPainter на QOpenGLWidget
Отправлено: __Heaven__ от Март 26, 2015, 14:23
Привет, друзья!
Никак не могу понять, каким образом я должен что-то настроить, чтобы суметь нарисовать что-либо на QOpenGLWidget с помощью QPainter... Чтение асистента, разбор примера и гугл как-то не помогают.

Рисование я пытаюсь сделать в paintGL(). Даже закомментировав весь код  paintGL() кроме пэинтера ничего не происходит. Где-то увидел, что формат поверхности должен быть настроен, но это тоже не помогло. Один раз как-то повезло, нарисовалась часть того, что мне надо и то, после сворачивания и разворачивания. beginNativePainting тоже не помогает.
Прошу помочь...


Название: Re: Использование QPainter на QOpenGLWidget
Отправлено: Igors от Март 26, 2015, 16:33
Да, там чижело.

Поставьте тестовое рисование с QPainter первым в paintGL. Не делайте никаких вызовов OpenGL (пока), там есть неск отличных возможностей зарезать тот QPainter. Напр GL_CULL_FACE.- и QPainter готов. Если не поможет - выкладывайте проект.


Название: Re: Использование QPainter на QOpenGLWidget
Отправлено: __Heaven__ от Март 26, 2015, 17:27
понятно... То есть нужно подготовить почву перед рисованием?
Здесь можно отделаться vao?


Название: Re: Использование QPainter на QOpenGLWidget
Отправлено: __Heaven__ от Март 26, 2015, 17:33
Да, хочу добавить, что мне эта связка нужна только для того, чтобы вывести текст. Быть может мне в другую сторону копать?


Название: Re: Использование QPainter на QOpenGLWidget
Отправлено: Igors от Март 26, 2015, 17:58
понятно... То есть нужно подготовить почву перед рисованием?
Здесь можно отделаться vao?
Наоборот, не готовить, а отключить эту почву :) Отключите весь Ваш код (вызовы OpenGL) и пробуйте QPainter

Да, хочу добавить, что мне эта связка нужна только для того, чтобы вывести текст. Быть может мне в другую сторону копать?
Как уже говорил, у меня был текст "средствами OpenGL" (на старте рисую все буквы, потом через glCallList). Невдобняк, кода много а возможностей мало. Снес, перевел на QPainter


Название: Re: Использование QPainter на QOpenGLWidget
Отправлено: Racheengel от Июль 02, 2015, 10:58
хоть и старый пост...но с QPainter большие проблемы - он далеко не на всех карточках будет корректно текст выводить поверх GL контекста.


Название: Re: Использование QPainter на QOpenGLWidget
Отправлено: Igors от Июль 03, 2015, 08:59
хоть и старый пост...но с QPainter большие проблемы - он далеко не на всех карточках будет корректно текст выводить поверх GL контекста.
Насчет "карточек" - верится с трудом, иначе бы троллей давно затюкали. По меньшей мере багов было бы запостено масса. Скорее всего та же проблема что и у меня - некоторые вызовы OpenGL могут блокировать вывод текста, и отловить такие вызовы хлопотно.


Название: Re: Использование QPainter на QOpenGLWidget
Отправлено: Racheengel от Июль 03, 2015, 15:36
А Тролли это и не скрывают, например, по поводу void QGLWidget::renderText(...) написано:

Note: This function is not supported on OpenGL/ES systems.

И там же ниже:

Overpaint with QPainter::drawText() instead.

Проблема в том, что и оверпаинт не всякое железо поддерживает :(




Название: Re: Использование QPainter на QOpenGLWidget
Отправлено: Igors от Июль 04, 2015, 06:34
Overpaint with QPainter::drawText() instead.

Проблема в том, что и оверпаинт не всякое железо поддерживает :(
Overpaint сам по себе никто чтобы его поддерживать, просто метод в конце сеанса рисования. Если на каких-то картах не работает drawText - приведите ссылки/факты на каких, а то пока на уровне "одна бабушка сказала"  :)


Название: Re: Использование QPainter на QOpenGLWidget
Отправлено: Racheengel от Июль 06, 2015, 13:41
Например, карта Radeon X1600, Win7, Qt 5.3.1 - не работает ни drawText сам по себе, ни overpaint example.
Драйвер 8.593.100 от АTI.
Direct3d 8.14.10.0647
OpenGL 6.14.10.8545

Может в других осях или с другим драйвером и будет работать, не знаю. Конкретно с этими версиями ни в какую.


Название: Re: Использование QPainter на QOpenGLWidget
Отправлено: __Heaven__ от Февраль 22, 2017, 07:47
Короче, решил проблему с использованием т.н. stateless rendering в той реализации, как я его понимаю :) .
Перед рисованием пэинтеру говорю begin(this), и обособляю gl операции в beginNativePainting и endNativePainting. Для вывода паинтером сбрасываю контекст в исходную позицию, делаю вывод текста, прямоугольников, чего хотите и снова beginNativePainting и т.д. В конце ставим end.
begin, end и вынос painter в член класса необходимы, чтобы нашим painterом могли пользоваться наследники, точно так же через begin, end после отрисовки базовым виджетом.