0

x64 プラットフォームで OpenGL ウィンドウを作成しようとしています。初期化コードは x86/Win32 では機能しますが、x64 では "wglMakeCurrent" で失敗します。問題は、pixelformat の設定または DC の取得 (getDC()) にあると思います。PIXELFORMATDESCRIPTOR のさまざまな設定を既に試しましたが (OpenGL の x64 実装は、使用している設定をサポートしていないと想定しています)、そこでは成功しませんでした。デバッガーは、hdc が破損している可能性があることを示します (0xfffffffff10102e0 のようなもの) - しかし、wglCreateContext は有効な外観の hglrc (つまり、0x0000000000010000) を返します。しかし、値をオンザフライで hdc から 0x0000000010102e0 に変更しても (wglCreateContext の呼び出し前にデバッガーを使用して) wglMakeCurrent は失敗します。

私は、Visual Studio 12 RC 1 を使用して Windows 8 を使用しています。それとも、x64 OpenGL 実装に何らかの制限があるのでしょうか?

#include <windows.h>
#pragma comment(lib, "OpenGL32.lib")

static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
  switch (uMsg){
  case WM_DESTROY:
    PostQuitMessage(0);
    break;
  default:
    break;
  }
  return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
  WNDCLASSEX wc;
  ZeroMemory(&wc, sizeof(WNDCLASSEX));
  wc.cbSize = sizeof(WNDCLASSEX);
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  wc.lpfnWndProc = WindowProc;
  wc.hInstance = nullptr;
  wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
  wc.lpszClassName = "WindowClassTest";
  RegisterClassEx(&wc);
  DWORD dwStyle = WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU;
  RECT WindowRect;
  WindowRect.left = (long)0;
  WindowRect.right = (long)640;
  WindowRect.top = (long)0;
  WindowRect.bottom = (long)480;
  AdjustWindowRect(&WindowRect, dwStyle, FALSE);
  HWND hWnd = CreateWindowEx(0,
    "WindowClassTest",
    "WindowTitle",
    dwStyle,
    0, 0,
    WindowRect.right - WindowRect.left,
    WindowRect.bottom - WindowRect.top,
    nullptr,
    nullptr,
    wc.hInstance,
    (LPVOID) nullptr);
  wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
  ShowWindow(hWnd, SW_SHOW);
  SetFocus(hWnd);
  HDC hdc = GetDC(hWnd);
  int         pf;
  PIXELFORMATDESCRIPTOR pfd;
  memset(&pfd, 0, sizeof(pfd));
  pfd.nSize = sizeof(pfd);
  pfd.nVersion = 1;
  pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
  pfd.iPixelType = PFD_TYPE_RGBA;
  pfd.cColorBits = 32;
  pf = ChoosePixelFormat(hdc, &pfd);
  if (pf == 0) {
    MessageBox(NULL, "ChoosePixelFormat() failed:  "
      "Cannot find a suitable pixel format.", "Error", MB_OK);
  }
  if (SetPixelFormat(hdc, pf, &pfd) == FALSE) {
    MessageBox(NULL, "SetPixelFormat() failed:  "
      "Cannot set format specified.", "Error", MB_OK);
  }
  DescribePixelFormat(hdc, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
  HGLRC hglrc = wglCreateContext(hdc);
  if (!wglMakeCurrent(hdc, hglrc)){
    MessageBox(NULL, "wglMakeCurrent() failed:  "
      "Cannot make context current.", "Error", MB_OK);
  }

  /* left out other unnecessary code here*/
  return 0;
}
4

1 に答える 1

4

これは、Windows 8.x 仮想マシン内で 64 ビット OpenGL アプリケーションを実行している場合に発生する非常に特殊なバグのようです。利用可能なレポート (以下を参照) に基づいて、次の場合に発生します。

  • アプリケーションは、Visual Studio >= 2012 を使用して x64 用にコンパイルされています
  • VM (Parallels/VMWare) 内で実行されている Windows 8.x で実行されます。

Windows 用のアプリケーションをコンパイルするために使用する Parallels VM で同じ問題が発生しています。一時的な回避策は、32 ビット ビルドを使用するか、以前のバージョンの Visual Studio (私は 2010 を使用) を使用して 64 ビット用にコンパイルすることでした。

重要なことに、エミュレートされていないハードウェアで実行されている Windows 8.x は影響を受けないようです。

この問題について言及している他の人々へのリンク:

于 2013-11-19T23:27:45.667 に答える