2

Windows マシンで OpenGL 4.0 コンテキストを作成するプログラムがあります。このコードは、自分のコンピューターでは機能しますが、友人のコンピューターでは機能しません。 wglCreateContextAttribsARB私の友人の Nvidia カードは OpenGL 4.4 をサポートしており、下位互換性のあるコンテキストを返すことができるはずですが、NULL を返します。他のすべての呼び出しは期待どおりに機能します。

これはコンテキスト作成コードです:

dc = GetDC(window::get());

PIXELFORMATDESCRIPTOR pfd = { 0 };
pfd.nSize = sizeof(pfd);
pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;

int nPixelFormat = ChoosePixelFormat(dc, &pfd);
SetPixelFormat(dc, nPixelFormat, &pfd);
HGLRC tempRC = wglCreateContext(dc);
wglMakeCurrent(dc, tempRC);
glewInit();

static const int attributes[] = {
    WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
    WGL_CONTEXT_MINOR_VERSION_ARB, 0,
    NULL
};

rc = wglCreateContextAttribsARB(dc, NULL, attributes);

if (rc == NULL) {
    abort();
}

wglMakeCurrent(NULL, NULL);
wglDeleteContext(tempRC);
wglMakeCurrent(dc, rc);

glClearColor(0.2, 0.4, 0.6, 1.0);
glEnable(GL_DEPTH_TEST);
wglSwapIntervalEXT(1);

別の人が同様の問題を抱えており、この質問をここに投稿しました。しかし、彼らの問題を解決したことは、私の問題を解決することではありません。私は完全に困惑しています。

4

1 に答える 1

3

基本コンテキストのベンダー文字列を確認してください。また、他の OpenGL プログラムが正しく実行されているかどうかも確認してください。

グラフィックス アクセラレーションの使用を完全に無効にできるものはいくつかありますが、そのほとんどはミラー ドライバー (リモート デスクトップ、画面録画など) に関連しています。

また、一部のラップトップには、統合 Intel 1グラフィックス (iGPU) と個別の nVidia または AMD グラフィックス (dGPU) の両方が搭載されています。ドライバーがゲームまたはベンチマークの実行を検出するまで、dGPU の電源がオフになり、バッテリーの寿命が延びます。

C または C++ では、nVidia の場合、アプリケーションの dGPU を要求する比較的簡単な方法があります。

extern "C" { _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; }

残念ながら、人々はまだ AMD のような他のハイブリッドでこれを行う方法を探しています


1 AMD は iGPU を搭載したプロセッサーも製造していますが、それらの機能はより完全であり (遅い場合)、dGPU も存在する場合、それらは不均衡な CrossFire の形で連携します。したがって、そのような場合、dGPU を明示的に有効にする必要はないと思います。AMD APU (コンボ CPU + iGPU) と nVidia dGPU を使用している場合、何が起こるかわかりません。

于 2014-07-14T21:16:56.037 に答える