Russian Qt Forum
Ноябрь 25, 2024, 07:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Использование QPainter на QOpenGLWidget  (Прочитано 10952 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Март 26, 2015, 14:23 »

Привет, друзья!
Никак не могу понять, каким образом я должен что-то настроить, чтобы суметь нарисовать что-либо на QOpenGLWidget с помощью QPainter... Чтение асистента, разбор примера и гугл как-то не помогают.

Рисование я пытаюсь сделать в paintGL(). Даже закомментировав весь код  paintGL() кроме пэинтера ничего не происходит. Где-то увидел, что формат поверхности должен быть настроен, но это тоже не помогло. Один раз как-то повезло, нарисовалась часть того, что мне надо и то, после сворачивания и разворачивания. beginNativePainting тоже не помогает.
Прошу помочь...
« Последнее редактирование: Февраль 22, 2017, 11:28 от __Heaven__ » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Март 26, 2015, 16:33 »

Да, там чижело.

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

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Март 26, 2015, 17:27 »

понятно... То есть нужно подготовить почву перед рисованием?
Здесь можно отделаться vao?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Март 26, 2015, 17:33 »

Да, хочу добавить, что мне эта связка нужна только для того, чтобы вывести текст. Быть может мне в другую сторону копать?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Март 26, 2015, 17:58 »

понятно... То есть нужно подготовить почву перед рисованием?
Здесь можно отделаться vao?
Наоборот, не готовить, а отключить эту почву Улыбающийся Отключите весь Ваш код (вызовы OpenGL) и пробуйте QPainter

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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Июль 02, 2015, 10:58 »

хоть и старый пост...но с QPainter большие проблемы - он далеко не на всех карточках будет корректно текст выводить поверх GL контекста.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 03, 2015, 08:59 »

хоть и старый пост...но с QPainter большие проблемы - он далеко не на всех карточках будет корректно текст выводить поверх GL контекста.
Насчет "карточек" - верится с трудом, иначе бы троллей давно затюкали. По меньшей мере багов было бы запостено масса. Скорее всего та же проблема что и у меня - некоторые вызовы OpenGL могут блокировать вывод текста, и отловить такие вызовы хлопотно.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Июль 03, 2015, 15:36 »

А Тролли это и не скрывают, например, по поводу void QGLWidget::renderText(...) написано:

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

И там же ниже:

Overpaint with QPainter::drawText() instead.

Проблема в том, что и оверпаинт не всякое железо поддерживает Грустный


Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июль 04, 2015, 06:34 »

Overpaint with QPainter::drawText() instead.

Проблема в том, что и оверпаинт не всякое железо поддерживает Грустный
Overpaint сам по себе никто чтобы его поддерживать, просто метод в конце сеанса рисования. Если на каких-то картах не работает drawText - приведите ссылки/факты на каких, а то пока на уровне "одна бабушка сказала"  Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #9 : Июль 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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Февраль 22, 2017, 07:47 »

Короче, решил проблему с использованием т.н. stateless rendering в той реализации, как я его понимаю Улыбающийся .
Перед рисованием пэинтеру говорю begin(this), и обособляю gl операции в beginNativePainting и endNativePainting. Для вывода паинтером сбрасываю контекст в исходную позицию, делаю вывод текста, прямоугольников, чего хотите и снова beginNativePainting и т.д. В конце ставим end.
begin, end и вынос painter в член класса необходимы, чтобы нашим painterом могли пользоваться наследники, точно так же через begin, end после отрисовки базовым виджетом.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.134 секунд. Запросов: 22.