在 OpenGL Win32 上激活多重采样

Activating Multisample on OpenGL Win32

我想在 win32 中的 OpenGL 上下文中设置 MSAA API。一切正常,但 MSAA 只是不想激活。这是我构建上下文的代码:

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

代码工作正常,它是在 class 中创建 hWnd 之后调用的,而不是在 WM_CREATE 情况下的 WndProc 中调用的...有什么问题吗?

我看到你要求 16 个样本的部分。但是我没有看到你 enabled GL_MULTISAMPLE 的部分。没有它,渲染到多采样缓冲区将与渲染到单个采样缓冲区没有区别。

此外,我建议您使用 framebuffer object for your multisample render target instead of the default framebuffer. Yes, it's nice that the default framebuffer can be resized by the window. But by using a framebuffer object, you can control when multisampling is resolved

此外,它还允许您避免驱动程序令人讨厌的控制面板选项干扰您的样本计数;)

我找到问题了。基本上,您不能在本文提到的 window 上调用 SetPixelFormat:https://www.khronos.org/opengl/wiki/Creating_an_OpenGL_Context_(WGL)#Proper_Context_Creation

解决方案基本上是创建一个虚拟 window(不可见)启用 opengl 并将其删除。我从这里复制了代码,它对我有用 Create Modern OpenGL context using WGL?