OpenGL サポートをチェックするインストーラーを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/126028

質問

弊社には OpenGL を使用した 3D ビューアがありますが、クライアントから「機能しない」という苦情が時々寄せられます。これらの問題のほとんどは、事実上現代の 3D リアルタイム ゲームをビジネス用ラップトップ コンピュータで使用しようとしたことに起因しているのではないかと考えられます。

私たちが使用している Windows msi インストーラーで、openGL のサポートを確認するにはどうすればよいでしょうか?

補足として、「OpenGL がサポートするグラフィック カードのリストは?」に答えていただければ幸いです。グーグルがここで役に立たないのは奇妙です..

役に立ちましたか?

解決

顧客が「動作しない」という意味を何を意味するかによって異なります。それは次のいずれかです。

  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) が発生する可能性が高く、有効な操作を実行するとドライバーがクラッシュします。

以下は、ダミーの OpenGL コンテキストを作成し、情報 (GL バージョン、グラフィック カード名、拡張機能など) を取得する C++/WinAPI コード スニペットです。

// 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 ドライバーのバグを回避するには、そのバグを特定して回避する必要があります。たくさんの仕事。

他のヒント

過去 10 年以内に製造されたすべてのラップトップが OpenGL をサポートしていると想定するのがかなり安全であるため、単に OpenGL のハードウェア サポートをチェックすることに頼るのは問題があると思います。(ただし、これらのラップトップが本当にそれほど古いものである場合は、おそらく このウィキ 役立つかもしれません?)

ただし、プログラムがグラフィックスを多用しているだけの場合は、最初に顧客のシステムがゼロに達しているかどうかを確認するための小さなベンチマーク プログラムをお勧めします。試してみてもいいでしょう ここ, 、既存のベンチマーク ツールのいずれかを使用できるかどうかを確認するか、プログラム用に特にベンチマーク ツールを作成してみることもできます。小さなテスト スクリプトは、高負荷下でのプログラムの実行をシミュレートし、FPS などの情報を記録します。
前者の場合、テスト実行を MSI インストーラーに統合することもできるかもしれませんが、私はこの種の経験はありません。

これらがお役に立てば幸いです。

OpenGL は、Windows NT または Win95 以降 Windows の一部です。OpenGL がプリインストールされていない Windows システムを見つけることはまずありません (例:Windows 3.1)

ただし、アプリケーションには、非常に古いバージョンの Windows に付属しているデフォルトの OpenGL 1.1 よりも新しいバージョンの OpenGL が必要な場合があります。それはプログラムから確認できます。msi からそれを見つける方法がわかりません。

OpenGL は、サービス パックなどのインストールではなく、グラフィック ドライバーを介して更新されることに注意してください。

OpenGL 対応グラフィック カードについて:すべてに OpenGL が搭載されています。顧客が石器時代の ISA ET4000 グラフィック カードを使用している場合でも、ソフトウェア レンダリングを介して少なくとも OpenGL 1.1 を搭載しています。

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 の使用方法の詳細については、「GLEW」を参照してください。 ここ.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top