Search code examples
c++winapiopenglglewmsaa

Activating Multisample on OpenGL Win32


I want to set up MSAA on an OpenGL context in win32 API. Everything is working fine, but the MSAA just doesn't want to activate. Here is my code for building the context:

void Display::CreateGLContext(HWND hWND) {
mHDC = GetDC(hWND);  //get current windows device context

int nPixelFormat;

PIXELFORMATDESCRIPTOR pfd; // Create a new PIXELFORMATDESCRIPTOR (PFD)  
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); // Clear our  PFD  
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); // Set the size of the PFD to the size of the class  
pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW; // Enable double buffering, opengl support and drawing to a window  
pfd.iPixelType = PFD_TYPE_RGBA; // Set our application to use RGBA pixels  
pfd.cColorBits = 32; // Give us 32 bits of color information (the higher, the more colors)  
pfd.cDepthBits = 16; // Give us 32 bits of depth information (the higher, the more depth levels)  
pfd.iLayerType = PFD_MAIN_PLANE; // Set the layer of the PFD

/*      Choose best matching format*/
nPixelFormat = ChoosePixelFormat(mHDC, &pfd);

/*      Set the pixel format to the device context*/
SetPixelFormat(mHDC, nPixelFormat, &pfd);

HGLRC tempRC = wglCreateContext(mHDC);
wglMakeCurrent(mHDC, tempRC);

if (glewInit() != GLEW_OK) {
    MessageBox(mHWND, "Eroare", "glew", MB_OK);
}
int nPixelFormat2;

BOOL bValidPixFormat;
UINT nMaxFormats = 1;
UINT nNumFormats;
float pfAttribFList[] = { 0, 0 };
int piAttribIList[] = { 
    WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
    WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
    WGL_COLOR_BITS_ARB, 32,
    WGL_RED_BITS_ARB, 8,
    WGL_GREEN_BITS_ARB, 8,
    WGL_BLUE_BITS_ARB, 8,
    WGL_ALPHA_BITS_ARB, 8,
    WGL_DEPTH_BITS_ARB, 16,
    WGL_STENCIL_BITS_ARB, 0,
    WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
    WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
    WGL_SAMPLE_BUFFERS_ARB, GL_TRUE,
    WGL_SAMPLES_ARB, 16,
    0, 0 };

bValidPixFormat = wglChoosePixelFormatARB(mHDC, piAttribIList, pfAttribFList, nMaxFormats, &nPixelFormat2, &nNumFormats);

if (!bValidPixFormat)
{
    MessageBox(NULL, "Invalid Pixel Format", "Error! (SetupWGLPixelFormat)", MB_OK);
}

SetPixelFormat(mHDC, nPixelFormat2, &pfd);


mGLRenderContext = wglCreateContext(mHDC);

wglMakeCurrent(mHDC, NULL);
wglDeleteContext(tempRC);
wglMakeCurrent(mHDC, mGLRenderContext);

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
}

The code works fine, it is called after creating hWnd in the main class, not in WndProc on the WM_CREATE case... What can be wrong?


Solution

  • I have found the problem. Basically you can't call SetPixelFormat on the same window as this article mentions: https://www.khronos.org/opengl/wiki/Creating_an_OpenGL_Context_(WGL)#Proper_Context_Creation

    The solution is basically to create a dummy window(not visible) enable opengl and delete it. I have copied the code from here and it worked for me Create Modern OpenGL context using WGL?