Pergunta

Temos um visualizador 3D que usa OpenGL, mas os nossos clientes, por vezes queixam-se que "não está funcionando". Nós suspeitamos que a maioria desses problemas derivam deles tentando usar, o que está em vigor um jogo moderno 3D em tempo real, em um computador businiss laptop.

Como podemos, nas janelas MSI instalador usamos, cheque de suporte para OpenGL?

E como uma nota lateral, se você puder responder "Lista de OpenGL apoiado placas gráficas?", Que também seria greate. Estranho que google não ajuda aqui ..

Foi útil?

Solução

Depende do que os clientes querem dizer com "não está funcionando". Poderia ser um dos seguintes:

  1. ele não instala / lançamento em tudo, devido à falta de algum apoio OpenGL.
  2. lança, mas cai mais adiante.
  3. lançamentos, não falhar, mas a renderização é corrupto.
  4. lançamentos e torna tudo corretamente, mas o desempenho é abismal.

Todas as versões do Windows (desde 95) tem suporte a OpenGL embutido. Portanto, é improvável que causa a situação 1) acima, a menos que você aplicativo requer versão superior OpenGL.

No entanto, que a implementação OpenGL padrão é OpenGL 1.1 com renderização software . Se o usuário não instalar manualmente drivers que tenham suporte OpenGL (qualquer driver baixado do site NVIDIA / AMD / Intel terá OpenGL), que será o padrão para essa implementação lenta e idade. Isto é bastante susceptível de causar situações 3) e 4) acima.

Mesmo se OpenGL está disponível, por drivers do Windows OpenGL não são muito robustos, para dizer suavemente. Vários bugs nos drivers são muito propensos a causar situação 2), onde fazendo algo causas válidas um acidente no driver.

Aqui está um trecho de código C ++ / WinAPI que cria um boneco contexto OpenGL e recupera info (versão GL, gráficos nome do cartão, extensões etc.):

// 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 );

Você poderia de alguma forma ligar esse código em seu instalador ou aplicação e pelo menos a versão verificação GL por ser 1,1; isso irá detectar situação "driver não está instalado". Para contornar erros de driver OpenGL reais, bem, você tem que entendê-los e trabalhar em torno deles. Lotes de trabalho.

Outras dicas

Eu acho que você pode ter um problema com a depender de simplesmente verificar suporte de hardware para OpenGL como é razoavelmente seguro supor que cada laptop feito nos últimos 10 anos o fornece. (Embora se esses laptops realmente é que o poder de idade, então talvez nesta wiki ajuda?)

No entanto, se é justo que o seu programa é gráficos intensivos, então eu provavelmente recomendar um pequeno programa de referência para verificar se seus sistemas clientes são até zero, em primeiro lugar. Você poderia tentar aqui , para ver se você pode usar uma das ferramentas de referência pré-existentes para ajudá-lo, ou você pode tentar escrever um para o seu programa especificamente por exemplo, um script de teste pequeno que simula o funcionamento de seu programa sob uma carga pesada e registros de informações como FPS e assim por diante.
Para o ex-você pode até achar que é possível integrar um teste para o instalador MSI, no entanto eu não tive qualquer experiência neste tipo de coisa.

Espero que você encontrá-los úteis.

OpenGL faz parte do Windows desde o Windows NT ou Win95. É improvável que você nunca vai encontrar um sistema de janelas onde OpenGL não é pré-instalado (por exemplo, Windows 3.1)

No entanto, a sua aplicação pode precisar de uma versão mais recente do OpenGL que o padrão OpenGL 1.1 que vem com versões muito antigas do Windows. Você pode verificar que a partir de seu programa. Eu não sei de nenhuma maneira como achar que a partir msi.

Note que o OpenGL é atualizado via os drivers gráficos, e não através da instalação de um service pack ou assim.

Em relação OpenGL habilitado placas gráficas: Todos têm OpenGL. Mesmo se o cliente utiliza uma placa gráfica ISA ET4000 da idade da pedra, ele pelo menos tem OpenGL 1.1 via software de renderização.

Windows vem com suporte para OpenGL 1.1 (como outros, conhecida aqui). Assim, os problemas os usuários estão enfrentando é devido a extensões que foram adicionados ao OpenGL após 1.1. Se você estiver usando a biblioteca GLEW, é bastante fácil de verificar o suporte para todas as extensões que você está usando programaticamente. Veja como verificar se há suporte de Oclusão Inquérito:

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;

Para mais informações sobre usando GLEW, consulte aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top