OpenGL сглаживание с использованием GLEW с WGL

Я относительно новичок в OpenGL и хотел бы добавить сглаживание в мой проект C++ Win32. В настоящее время я получаю контекст устройства в оконной процедуре, когда получено сообщение WM_CREATE, а затем создаю контекст OpenGL, используя дескриптор формата пикселя, например:

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
//...

switch (msg) {
    case WM_CREATE:
        log("Starting WM_CREATE...");
        hDC = GetDC(hWnd);

        //Pixel Format
        ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));
        pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
        pfd.iPixelType = PFD_TYPE_RGBA;
        pfd.cColorBits = 32;
        pfd.cDepthBits = 24;
        pfd.cStencilBits = 8;

        format = ChoosePixelFormat(hDC, &pfd);
        if (!SetPixelFormat(hDC, format, &pfd)) {
           log("Error: Could not set pixel format.");
           PostQuitMessage(1);
           break;
        }
        //Create Render Context
        hRC = wglCreateContext(hDC);
        if (!wglMakeCurrent(hDC, hRC)) {
           log("Error: Could not activate render context.");
           PostQuitMessage(1);
           break;
        }

        //Initialize GLEW
        if (glewInit()) {
           log("Error: Could not initialize GLEW.");
           PostQuitMessage(1);
           break;
        }

        //Other initialization goes here
        //...

        break;
    //...
    }
    return 0;
}

Чтобы заставить работать сглаживание, я понимаю, что мне нужно использовать расширение типа WGL_ARB_multisample. Кажется, есть очень мало примеров того, как на самом деле использовать это, особенно с GLEW. Как мне изменить код, чтобы заставить его работать? Благодарю.

1 ответ

Решение

GLEW также поддерживает расширения WGL и glX. Для WGL вам нужно wglew.h заголовочные файлы. Он работает так же, как и для расширений GL: GLEW автоматически получит указатели на функции для расширений wgl с помощью glewInit() вызов.

В Windows вы должны сделать следующее:

  1. Создайте "вспомогательный" контекст GL с (насколько это возможно) теми же атрибутами, что и контекст GL, который вы действительно хотите создать. Обратите внимание, что GL и WGL будут зависеть от GL-контекста, который вы создаете в Windows.
  2. Используйте вспомогательный контекст GL, чтобы получить указатели Расширения wgl. Вы также должны проверить, если расширения доступны, конечно.
  3. Создайте реальный контекст GL, используя расширения WGL, и
  4. уничтожить вспомогательный контекст.

Теперь WGL_ARB_multisample не определяет сами по себе функции расширения wgl. Он просто определяет новые атрибуты для wglChoosePixelFormatEXT() из WGL_EXT_pixel_fromat. И это то, что вы должны вызвать на шаге 3, чтобы запросить формат пикселей, поддерживающий мультисэмплинг.

Другие вопросы по тегам