Название: [РЕШЕНО] Использование 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 понятно... То есть нужно подготовить почву перед рисованием? Наоборот, не готовить, а отключить эту почву :) Отключите весь Ваш код (вызовы OpenGL) и пробуйте QPainterЗдесь можно отделаться vao? Да, хочу добавить, что мне эта связка нужна только для того, чтобы вывести текст. Быть может мне в другую сторону копать? Как уже говорил, у меня был текст "средствами 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 после отрисовки базовым виджетом. |