Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在OpenGL Win32上激活多样本_C++_Winapi_Opengl_Glew_Msaa - Fatal编程技术网

C++ 在OpenGL Win32上激活多样本

C++ 在OpenGL Win32上激活多样本,c++,winapi,opengl,glew,msaa,C++,Winapi,Opengl,Glew,Msaa,我想在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

我想在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\u MULTISAMPLE
的部分。否则,渲染到多采样缓冲区的行为与渲染到单个采样缓冲区的行为没有什么不同

另外,我建议您对多采样渲染目标使用一个帧缓冲区,而不是默认的帧缓冲区。是的,可以通过窗口调整默认帧缓冲区的大小,这很好。但通过使用帧缓冲区对象,您可以控制时间


此外,它还允许您避免驾驶员讨厌的控制面板选项干扰采样计数;)

我看到了你要16个样品的部分。但是我没有看到您启用了
GL\u MULTISAMPLE
的部分。否则,渲染到多采样缓冲区的行为与渲染到单个采样缓冲区的行为没有什么不同

另外,我建议您对多采样渲染目标使用一个帧缓冲区,而不是默认的帧缓冲区。是的,可以通过窗口调整默认帧缓冲区的大小,这很好。但通过使用帧缓冲区对象,您可以控制时间


此外,它还允许您避免驾驶员讨厌的控制面板选项干扰采样计数;)

我发现了问题所在。基本上,您不能在本文提到的同一窗口上调用SetPixelFormat:


解决方案基本上是创建一个虚拟窗口(不可见),启用opengl并删除它。我从这里复制了代码,它对我起了作用

我发现了问题。基本上,您不能在本文提到的同一窗口上调用SetPixelFormat:


解决方案基本上是创建一个虚拟窗口(不可见),启用opengl并删除它。我从这里复制了代码,它对我有用

谢谢你这么快的回答。。。我在最后一次wglMakeCurrent之后添加了glEnable(GL_MULTISAMPLE),没有任何更改…
GL_MULTISAMPLE
默认启用。因此,除非之前明确禁用,否则调用
glEnable(GL\u MULTISAMPLE)
是不可行的。感谢您这么快的回答。。。我在最后一次wglMakeCurrent之后添加了glEnable(GL_MULTISAMPLE),没有任何更改…
GL_MULTISAMPLE
默认启用。因此,除非之前明确禁用,否则调用
glEnable(GL\u MULTISAMPLE)
是不可行的。您能否尝试
glGetIntegerv(GL\u SAMPLES,…)
来再次检查您是否实际获得了多采样帧缓冲区?此外,您还可以尝试使用更普遍支持的值,例如样本数为4。
WGL\u COLOR\u BITS\u ARB
的值应该是24(它只计算RGB位),但这可能没有什么害处。它返回一个值为0的整数。我确定我没有创建上下文ok。。。但是我找不到一个用wgl属性创建上下文的例子。我知道这是一个老问题,但是在Windows中,你只能设置一次像素格式。您必须删除整个窗口,并在获得有效的nPixelFormat2后再次创建它。您是对的。如果没有GLEW,您无法获得用于多采样的有效像素格式,并且如果没有活动的opengl上下文,您也无法使GLEW初始化。因此,您需要首先创建一个临时窗口,在其opengl上下文中初始化glew,获取multisample的pixelformat(以及其他选项,如果您需要),然后销毁此窗口并使用基于此像素格式的新opengl上下文创建另一个窗口。我知道这很旧,但可能有人会看到这一点并解决问题。您可以尝试使用
glGetIntegerv(GL_SAMPLES,…)
来再次检查您是否实际拥有多采样帧缓冲区吗?此外,您还可以尝试使用更普遍支持的值,例如样本数为4。
WGL\u COLOR\u BITS\u ARB
的值应该是24(它只计算RGB位),但这可能没有什么害处。它返回一个值为0的整数。我确定我没有创建上下文ok。。。但是我找不到一个用wgl属性创建上下文的例子。我知道这是一个老问题,但是在Windows中,你只能设置一次像素格式。您必须删除整个窗口,并在获得有效的nPixelFormat2后再次创建它。您是对的。如果没有GLEW,您无法获得用于多采样的有效像素格式,并且如果没有活动的opengl上下文,您也无法使GLEW初始化。因此,您需要首先创建一个临时窗口,在其opengl上下文中初始化glew,获取multisample的pixelformat(以及其他选项,如果您需要),然后销毁此窗口并使用基于此像素格式的新opengl上下文创建另一个窗口。我知道这很古老,但也许有人会看到这一点并解决问题。是的,这就是多年前让它工作的答案。正如你所说,我创建了一个虚拟窗口,一切都按预期进行。谢谢你的回答。这可能会为其他有这个问题的人节省很多时间。是的,这就是多年前让它起作用的答案。正如你所说,我创建了一个虚拟窗口,一切都按预期进行。谢谢你的回答。这可能会为其他有此问题的人节省大量时间。