Как записать установщик, который проверяет на поддержку openGL?

6
задан Alexander Morland 24 September 2008 в 08:29
поделиться

3 ответа

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

  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, ну, в общем, необходимо понять их и работу вокруг них. Большая работа.

9
ответ дан 9 December 2019 в 22:42
поделиться

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

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

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

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

1
ответ дан 9 December 2019 в 22:42
поделиться

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

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
ответ дан 9 December 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: