gpt4 book ai didi

c++ - 在 OpenGL Win32 上激活多重采样

转载 作者:行者123 更新时间:2023-11-28 00:07:13 25 4
gpt4 key购买 nike

我想在 Win32 API 中的 OpenGL 上下文中设置 MSAA。一切正常,但 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);
}

代码运行良好,它是在主类中创建 hWnd 之后调用的,而不是在 WM_CREATE 情况下的 WndProc 中调用...可能有什么问题?

最佳答案

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

此外,我建议您使用 framebuffer object为您的多重采样渲染目标而不是默认的帧缓冲区。是的,可以通过窗口调整默认帧缓冲区的大小真是太好了。但是通过使用帧缓冲区对象,您可以控制何时 multisampling is resolved .

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

关于c++ - 在 OpenGL Win32 上激活多重采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34907832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com