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

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

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Техника отлова  (Прочитано 23283 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #30 : Март 01, 2015, 13:18 »

Ели бага раньше не было, то очень помогает git bisect в таких случаях - подходим к проблеме с другой стороны.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Март 08, 2015, 09:31 »

Еще один баг типа "хз где искать"

Рисую в окнах с помощью OpenGL. Первые 10-15 минут все норм. Затем почему-то поверх рисуется еще и wireframe, причем как-то грязно (явно не я рисовал). Какие есть мысли?

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Март 08, 2015, 10:45 »

Углубился в чтение букваря
Цитировать
The QOpenGLWidget's associated OpenGL context is guaranteed to be current whenever initializeGL() and paintGL() are invoked. Do not attempt to create OpenGL resources before initializeGL() is called. For example, attempting to compile shaders, initialize vertex buffer objects or upload texture data will fail when done in a subclass's constructor. These operations must be deferred to initializeGL().
Так initializeGL() and paintGL() вызываются когда дело дойдет до рисования. А до того как - если мне надо extensions пощупать, текстуры подгрузить и.т.п.?  Ну ладно, предположил что мои артефакты рисования связаны с тем что какие-то glXXX вызываются при неустановленном (или неверно установленном) контексте. Может это и не так, но других соображений нет. Теперь горожу scoped чтобы это отловить...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Март 08, 2015, 14:56 »

Тут такая милая вещичка  Улыбающийся
Код
C++ (Qt)
printf("1: GL error %d\n", glGetError());
glBegin(GL_LINES);
glVertex3f(0, 0, 0);
glVertex3f(1, 1, 1);
printf("2: GL error %d\n", glGetError());
glEnd();
printf("3: GL error %d\n", glGetError());
 
Печатает
Цитировать
1: GL error 0
2: GL error 0
3: GL error 1282
Где же ошибка  Непонимающий
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #34 : Март 08, 2015, 15:17 »

Номер ошибки не очень информативный, можно попробовать узнать описание ошибки с помощью gluErrorString Улыбающийся
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Март 08, 2015, 15:34 »

Номер ошибки не очень информативный, можно попробовать узнать описание ошибки с помощью gluErrorString Улыбающийся
Сразу видно что кошмары OpenGL Вам не снятся Улыбающийся  Это ж "invalid operation", какие-то др ошибки бывают редко.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #36 : Март 08, 2015, 16:43 »

А версия OpenGL какая? Не 3.1+ ли?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #37 : Март 08, 2015, 16:48 »

А версия OpenGL какая? Не 3.1+ ли?
На рабочей машине 2.1, но воспроизводится и на другой где 3.3
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #38 : Март 08, 2015, 16:53 »

На рабочей машине 2.1, но воспроизводится и на другой где 3.3
А линия на экране видна?
Где-то я читал, что начиная с тройки glBegin/glEnd собирались вообще выбросить.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Март 08, 2015, 17:03 »

А линия на экране видна?
Где-то я читал, что начиная с тройки glBegin/glEnd собирались вообще выбросить.
Видна. Эти вызовы уже много лет deprecated, но насчет выбрасывать не слышал. Иногда они очень нужны - напр тот же obj файл ими нарисовать легко, неск строк (пусть и скорость маленькая)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Эти вызовы уже много лет deprecated, но насчет выбрасывать не слышал. Иногда они очень нужны - напр тот же obj файл ими нарисовать легко, неск строк (пусть и скорость маленькая)
Да вроде в 3.4 уже нет даже упоминания.
« Последнее редактирование: Март 08, 2015, 21:07 от Old » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #41 : Март 09, 2015, 00:26 »

А вы с классами QOpenGLDebug... не работали?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #42 : Март 09, 2015, 09:31 »

Ну тут логика бессильна, вот "правельный ответ" найденный методом втыка
Код
C++ (Qt)
printf("1: GL error %d\n", glGetError());
glBegin(GL_LINES);
glVertex3f(0, 0, 0);
glVertex3f(1, 1, 1);
printf("2: GL error %d\n", glGetError());
glEnd();
printf("3: GL error %d\n", glGetError());
 
Печатает
Цитировать
1: GL error 0
2: GL error 0
3: GL error 1282
Если закомментировать печать 2, то печать 3 выдаст ноль. Ошибка вызывается самим glGetError, этот вызов недопустим между glBegin/glEnd. И все ошибки случившиеся в этом интервале будут выданы (станут доступны) лишь после вызова glEnd, поэтому печать 2 выдает ноль. Не слабо!  Улыбающийся

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

Сообщений: 11445


Просмотр профиля
« Ответ #43 : Март 09, 2015, 12:59 »

А вы с классами QOpenGLDebug... не работали?
Нема GL_KHR_debug экстеншна  Плачущий Плачущий Плачущий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #44 : Март 23, 2015, 12:54 »

Еще один "молодой интересный", с OpenGL не связан. Одно из окон (типовое, ничем не примечательное) почему-то показывается (после show) "замороженным" и не реагирует на нажатия. Ладно, в mousePressEvent добавляю такую печать
Код
C++ (Qt)
qDebug() << "win" << this << "parent" << parentWidget()
<< "global" << e->globalPos()
<< "local"  << e->pos();
 
qDebug() << "frameGeometry" << frameGeometry()
<< "mapFromGlobal" << mapFromGlobal(e->globalPos());
 
Получаю вывод
Цитировать
win CFilePalette(0x14b71100) parent QObject(0x0)  global QPoint(498,139) local QPoint(306,14)
frameGeometry QRect(0,288 640x480) mapFromGlobal QPoint(498,-149)
На экране показывается верно (окно 640x480 стоит в центре экрана 1024х768), а (frame)Geometry печатает не то (по X никак не ноль). И mapFromGlobal выдает бред.

Растерялся солдат...
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


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