Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ Определение поддерживаемой версии OpenGL с помощью модуля QtOpenGL

Автор: registr 24.1.2011, 19:37

Столкнулся с интересной проблемой, а потом как показалось даже ужасающий. В модуле QtOpenGL есть специальный метод, чтобы определить поддерживаемую платформой версию OpenGL. В Ассистанте написано мол так, используйте функцию QGLFormat::openGLVersionFlags(), чтобы определить поддерживаемую версию OpenGL на вашей платформе. Теперь через модуль QtOpenGL должна произойти связь с системными реализациями WGL, GLX, AGL и возвращена табличная констанста в 16-системе. На Windows по определению должна быть констаната, соответствующая версии 1.1, так как WGL поддерживате только 1.1

#include <QtGui>
#include <QIODevice>

void getOGLVersion();

int main(int argc, char** argv)
{  
   QApplication app(argc, argv);

   getOGLVersion();

   //...

   return app.exec();

void getOGLVersion()
{
   int i=(int)QGLFormat::openGLVersionFlags();
   QFile a("info.txt");
   a.open(QIODevice::WriteOnly);
   QTextStream out(&a);
   out << hex << i;
   a.close();
}

Вместо этого на Виндоус получаю число 3f - его нет в таблице, на ОпенСюзе 11.2 получаю 1f - его тоже нет в таблице. Пробовал через switch(), тогда просто нет совпадений и получаю дефаулт. Как быть? Похоже на баг или у меня кривые руки?

Автор: Алексей1153 24.1.2011, 19:55

смотрю в справочнике таблицу - есть константы 0x40 (2.1) и 0x20 (2.0). Ты как-будто бы 1 отнял от числа. Скопируй сюда весь enum QGLFormat::OpenGLVersionFlag

а версии 1.1 соответствует 0x01

кстати, там тип не int, а uint32_t

ааа, всё, дошло до меня. Там же комбинация битов! Вот и ответ :)

3f - это версии от 1.1 до 2.0 включительно

Автор: registr 24.1.2011, 20:06

Вот 3f лежит между 0x20 и 0x40. Но это не дает никакой информации. На виддоус должно быть 0x01 по определению, я даже брал функции из OpenGL 1.2, чтобы проверить определяются они или нет. Прбовал через switch()

switch(QGLFormat::openGLVersionFlags())
{
   case QGLFormat::OpenGL_Version_1_1:
      QMessageBox::information(0, "OpenGL info", "Version 1.1");
   break;
   // ... так до 2.1
   default: QMessageBox::information(0, "OpenGL info", "???");
}

В ответ получаю знаки вопроса.

Цитата(Алексей1153 @ 24.1.2011, 19:55) *
ааа, всё, дошло до меня. Там же комбинация битов! Вот и ответ :)

3f - это версии от 1.1 до 2.0 включительно

не понял

Автор: Алексей1153 24.1.2011, 20:12

3f - это комбинация битовых флагов

QGLFormat::OpenGL_Version_1_1 |
QGLFormat::OpenGL_Version_1_2 |
QGLFormat::OpenGL_Version_1_3 |
QGLFormat::OpenGL_Version_1_4 |
QGLFormat::OpenGL_Version_1_5 |
QGLFormat::OpenGL_Version_2_0


свич тут делу не поможет. Только так

QGLFormat::OpenGLVersionFlag f=QGLFormat::openGLVersionFlags(); 

if(f & QGLFormat::OpenGL_Version_1_1 )
{
}
else
if(f & QGLFormat::OpenGL_Version_1_2 )
{
}
else
if(f & QGLFormat::OpenGL_Version_1_3 )
{
}
else
...

Автор: registr 24.1.2011, 20:51

QGLFormat::OpenGLVersionFlags f=QGLFormat::openGLVersionFlags(); :)

Т.е. он просуммировал от _1_1 до _2_0. Тогда получается он связался не WGL, а с драйвером видеокарты...

Спасибо! :)

Автор: Алексей1153 24.1.2011, 20:54

Раскрывающийся текст
Цитата(registr @ 24.1.2011, 22:51) *
Пользователь №: 1234

прикольный номер у тебя ))

Автор: registr 24.1.2011, 21:10

Раскрывающийся текст

точно)

Получается из-за хитрых чисел всегда не будет хватать одного разряда, чтобы перейти на следующую версию, поэтому
QGLFormat::OpenGLVersionFlags f=QGLFormat::openGLVersionFlags(); 

if(f < QGLFormat::OpenGL_Version_1_1 )
{ // 0
}
else
if(f < QGLFormat::OpenGL_Version_1_2 )
{ // 1.1
}
else
if(f < QGLFormat::OpenGL_Version_1_3 )
{ // 1.2
}
else
...

Автор: Алексей1153 24.1.2011, 21:35

не понял, чего хочешь добиться

Автор: registr 24.1.2011, 21:47

Цитата(Алексей1153 @ 24.1.2011, 21:35) *
не понял, чего хочешь добиться

не понял вопроса, так будет выдаваться максимально поддерживаемая версия. Как при 3.0 и выше не знаю, надо qt поновее поставить. В твоем примере нужно убрать else, тогда будут выдавать все поддерживаемые версии от 1.1 до 2.0.

Автор: Алексей1153 24.1.2011, 23:08

T - минимальная версия, на которую проверяем (1.4)

T=
00001000


mask=((T-1) | T) =
00001111


считали версию V (1F)
V =
00011111


если mask<=V , то можно работать

Автор: registr 28.1.2011, 20:22

Не понял, зачем так мудрить. Чем плох код поста 7.

Автор: Алексей1153 28.1.2011, 22:01

registr, это разный код. В №7 - перебор значений, а в №10 - определение, что версия в системе больше или равна версии, использованной в программе

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)