Как написать программу установки, которая проверяет поддержку openGL? - PullRequest
6 голосов
/ 24 сентября 2008

У нас есть 3D-вьюер, который использует OpenGL, но наши клиенты иногда жалуются на то, что он «не работает». Мы подозреваем, что большинство этих проблем связано с тем, что они пытаются использовать, по сути, современную трехмерную игру в реальном времени, на портативном компьютере businiss.

Как мы можем в используемой программе установки Windows msi проверить поддержку openGL?

И в качестве примечания, если вы можете ответить на «Список поддерживаемых OpenGL графических карт?», Это также будет замечательно. Странно, что гугл тут не помогает ..

Ответы [ 4 ]

9 голосов
/ 24 сентября 2008

Зависит от того, что клиенты подразумевают под «не работает». Это может быть одно из:

  1. он вообще не устанавливается / не запускается из-за отсутствия поддержки OpenGL.
  2. запускается, но дальше вылетает.
  3. запускается, не падает, но рендеринг поврежден.
  4. он запускает и отображает все правильно, но производительность ужасна.

Все версии Windows (начиная с 95) имеют встроенную поддержку OpenGL. Так что вряд ли это вызовет ситуацию 1) выше, если только ваше приложение не требует более высокую версию OpenGL.

Однако реализация OpenGL по умолчанию - OpenGL 1.1 с программным обеспечением . Если пользователь не установил драйверы, которые поддерживают OpenGL вручную (любой драйвер, загруженный с сайта NVIDIA / AMD / Intel, будет иметь OpenGL), он по умолчанию будет использовать эту медленную и старую реализацию. Это может привести к ситуациям 3) и 4) выше.

Даже если OpenGL доступен, в Windows драйверы OpenGL не очень надежны, мягко говоря. Различные ошибки в драйверах с большой вероятностью могут вызвать ситуацию 2), когда выполнение чего-либо действительного вызывает сбой в драйвере.

Вот фрагмент кода C ++ / WinAPI, который создает фиктивный контекст OpenGL и извлекает информацию (версия GL, имя видеокарты, расширения и т. Д.):

// setup minimal required GL
HWND wnd = CreateWindow(
    "STATIC",
    "GL",
    WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
    0, 0, 16, 16,
    NULL, NULL,
    AfxGetInstanceHandle(), NULL );
HDC dc = GetDC( wnd );

PIXELFORMATDESCRIPTOR pfd = {
    sizeof(PIXELFORMATDESCRIPTOR), 1,
    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL,
    PFD_TYPE_RGBA, 32,
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0,
    16, 0,
    0, PFD_MAIN_PLANE, 0, 0, 0, 0
};

int fmt = ChoosePixelFormat( dc, &pfd );
SetPixelFormat( dc, fmt, &pfd );

HGLRC rc = wglCreateContext( dc );
wglMakeCurrent( dc, rc );

// get information
const char* vendor = (const char*)glGetString(GL_VENDOR);
const char* renderer = (const char*)glGetString(GL_RENDERER);
const char* extensions = (const char*)glGetString(GL_EXTENSIONS);
const char* version = (const char*)glGetString(GL_VERSION);

// DO SOMETHING WITH THOSE STRINGS HERE!

// cleanup
wglDeleteContext( rc );
ReleaseDC( wnd, dc );
DestroyWindow( wnd );

Вы можете каким-то образом подключить этот код к своему установщику или приложению и, по крайней мере, проверить версию GL на наличие версии 1.1; это обнаружит ситуацию "драйвер не установлен". Чтобы обойти фактические ошибки драйвера OpenGL, вы должны разобраться и обойти их. Много работы.

2 голосов
/ 24 сентября 2008

Я думаю, что у вас может возникнуть проблема с простой проверкой аппаратной поддержки OpenGL, так как можно с уверенностью предположить, что она есть на каждом ноутбуке, выпущенном за последние 10 лет. (Хотя, если эти ноутбуки действительно такие старые, возможно, эта вики может помочь?)

Однако, если ваша программа интенсивно использует графику, то я, вероятно, рекомендую небольшую тестовую программу, чтобы в первую очередь убедиться, что ваши клиентские системы работают с нуля. Вы можете попробовать здесь , чтобы посмотреть, можете ли вы использовать один из существующих инструментов для оценки производительности, или вы можете попробовать написать один для своей программы, например, например. небольшой тестовый скрипт, который симулирует запуск вашей программы под большой нагрузкой и записывает информацию, такую ​​как FPS и т. д.
В первом случае вы даже можете найти возможность интегрировать тестовый прогон в установщик MSI, однако я не имел никакого опыта в подобных вещах.

Надеюсь, вы найдете их полезными.

1 голос
/ 26 сентября 2008

Windows поставляется с поддержкой OpenGL 1.1 (как уже отмечали другие). Итак, проблемы, с которыми сталкиваются ваши пользователи, связаны с расширениями, которые были добавлены в OpenGL после 1.1. Если вы используете библиотеку GLEW, довольно просто проверить поддержку всех расширений, которые вы используете программно. Вот как проверить поддержку Occlusion Query:

if (GLEW_OK != glewInit())
{
    // GLEW failed!
    exit(1);
}

// Check if required extensions are supported
if (!GLEW_ARB_occlusion_query)
    cout << "Occlusion query not supported" << endl;

Подробнее об использовании GLEW см. здесь .

1 голос
/ 24 сентября 2008

OpenGL является частью Windows начиная с Windows NT или Win95. Вряд ли вы когда-нибудь найдете систему Windows, в которой OpenGL не предустановлен (например, Windows 3.1)

Однако вашему приложению может потребоваться более свежая версия OpenGL, чем стандартная версия OpenGL 1.1, которая поставляется с очень старыми версиями Windows. Вы можете проверить это из вашей программы. Я не знаю, как найти это в MSI.

Обратите внимание, что OpenGL обновляется с помощью графических драйверов, а не путем установки пакета обновления или около того.

Относительно графических карт с поддержкой OpenGL: у всех есть OpenGL. Даже если клиент использует графическую карту ISA ET4000 с каменного века, он, по крайней мере, использует OpenGL 1.1 с помощью программного рендеринга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...