0

I am relatively new to OpenGL and I would like to add anti-aliasing to my C++ Win32 project. I currently get a device context in the window procedure when the WM_CREATE message is received, and then create an OpenGL context using a pixel format descriptor, like this:

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;
}

In order to get antialiasing to work, I understand that I need to use an extension like WGL_ARB_multisample. There seem to be very few examples of how to actually use this, especially with GLEW. How would I go about modifying my code to get this to work? Thanks.

1 Answers1

1

GLEW also supports WGL and glX extensions. For wgl, you need the wglew.h header files. It works the same way as for GL extensions: GLEW will automatically get the functions pointers for wgl extensions with the glewInit() call.

On windows, what you actually have to do is the following:

  1. Create a "helper" GL context with (as much as possible) the same attributes as the GL context you actually want to create. Note that GL and WGL extnesions will depend on the GL context you create on windows.
  2. Use the helper GL context to get the wgl Extension pointers. You should also check if the extensions are available, of course.
  3. Create the real GL context using the WGL extensions, and
  4. destroy the helper context.

Now, WGL_ARB_multisample does not define any wgl extension functions in itself. It just defines new attributes for wglChoosePixelFormatEXT() from WGL_EXT_pixel_fromat. And that is what you have to call in step 3 to request a pixel format supporting multisampling.

derhass
  • 38,787
  • 2
  • 42
  • 61