crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Определение поддерживаемой версии OpenGL с помощью модуля QtOpenGL
registr
  опции профиля:
сообщение 24.1.2011, 19:37
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


Столкнулся с интересной проблемой, а потом как показалось даже ужасающий. В модуле 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
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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

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

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

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

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

Сообщение отредактировал Алексей1153 - 24.1.2011, 19:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 24.1.2011, 20:06
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


Вот 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
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


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

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

Спасибо! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.1.2011, 20:54
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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

прикольный номер у тебя ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 24.1.2011, 21:10
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


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

точно)

Получается из-за хитрых чисел всегда не будет хватать одного разряда, чтобы перейти на следующую версию, поэтому
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
...


Сообщение отредактировал registr - 24.1.2011, 21:13
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.1.2011, 21:35
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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

Сообщение отредактировал Алексей1153 - 24.1.2011, 21:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 24.1.2011, 21:47
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


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

не понял вопроса, так будет выдаваться максимально поддерживаемая версия. Как при 3.0 и выше не знаю, надо qt поновее поставить. В твоем примере нужно убрать else, тогда будут выдавать все поддерживаемые версии от 1.1 до 2.0.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.1.2011, 23:08
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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


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


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


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

Сообщение отредактировал Алексей1153 - 24.1.2011, 23:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 9:17