Windows SwapBuffer Nvidia碰撞

Windows SwapBuffer Nvidia碰撞,windows,winapi,opengl,Windows,Winapi,Opengl,编辑:我以为这只限于属性创建的GL上下文,但事实并非如此,所以我重写了这篇文章 嘿,伙计们,每当我打电话给SwapBuffers(hDC),我都会遇到车祸。如果我用WGL\u CONTEXT\u DEBUG\u BIT\u ARB创建它,我会得到一个 对一个信号量发了太多的帖子 从Windows中调用SwapBuffers。这可能是什么原因 更新:如果我不画图,不会发生崩溃,只需清除并交换 下面是一段代码,去掉了不相关的部分: static PIXELFORMATDESCRIPTOR pfd

编辑:我以为这只限于属性创建的GL上下文,但事实并非如此,所以我重写了这篇文章

嘿,伙计们,每当我打电话给SwapBuffers(hDC),我都会遇到车祸。如果我用WGL\u CONTEXT\u DEBUG\u BIT\u ARB创建它,我会得到一个

对一个信号量发了太多的帖子

从Windows中调用
SwapBuffers
。这可能是什么原因

更新:如果我不画图,不会发生崩溃,只需清除并交换

下面是一段代码,去掉了不相关的部分:

static  PIXELFORMATDESCRIPTOR pfd =             // pfd Tells Windows How We Want Things To Be
    {
        sizeof(PIXELFORMATDESCRIPTOR),              // Size Of This Pixel Format Descriptor
        1,                                          // Version Number
        PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
        PFD_SUPPORT_OPENGL |                        // Format Must Support OpenGL
        PFD_DOUBLEBUFFER,                           // Must Support Double Buffering
        PFD_TYPE_RGBA,                              // Request An RGBA Format
        32,                                         // Select Our Color Depth
        0, 0, 0, 0, 0, 0,                           // Color Bits Ignored
        0,                                          // No Alpha Buffer
        0,                                          // Shift Bit Ignored
        0,                                          // No Accumulation Buffer
        0, 0, 0, 0,                                 // Accumulation Bits Ignored
        24,                                         // 24Bit Z-Buffer (Depth Buffer)  
        0,                                          // No Stencil Buffer
        0,                                          // No Auxiliary Buffer
        PFD_MAIN_PLANE,                             // Main Drawing Layer
        0,                                          // Reserved
        0, 0, 0                                     // Layer Masks Ignored
    };

if (!(hDC = GetDC(windowHandle)))
    return false;

unsigned int PixelFormat;
if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd)))
    return false;

if (!SetPixelFormat(hDC, PixelFormat, &pfd))
    return false;

hRC = wglCreateContext(hDC);
if (!hRC) {
    std::cout << "wglCreateContext Failed!\n";
    return false;
}

if (wglMakeCurrent(hDC, hRC) == NULL) {
    std::cout << "Make Context Current Second Failed!\n";
    return false;
}

... // OGL Buffer Initialization

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glBindVertexArray(vao);
glUseProgram(myprogram);
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, (void *)indexStart);
SwapBuffers(GetDC(window_handle));
static PIXELFORMATDESCRIPTOR pfd=//pfd告诉Windows我们想要的东西
{
sizeof(PIXELFORMATDESCRIPTOR),//此像素格式描述符的大小
1,//版本号
PFD_DRAW_TO_WINDOW |//格式必须支持WINDOW
PFD_支持_OPENGL |//格式必须支持OPENGL
PFD_DOUBLEBUFFER,//必须支持双缓冲
PFD_TYPE_RGBA,//请求RGBA格式
32,//选择我们的颜色深度
0,0,0,0,0,0,//忽略颜色位
0,//没有Alpha缓冲区
0,//已忽略移位位
0,//无累积缓冲区
0,0,0,0,//忽略累加位
24,//24位Z缓冲区(深度缓冲区)
0,//没有模具缓冲区
0,//没有辅助缓冲区
PFD_主平面,//主绘图层
0,//保留
0,0,0//忽略图层遮罩
};
如果(!(hDC=GetDC(windowHandle)))
返回false;
无符号整数像素格式;
如果(!(像素格式=选择像素格式(hDC和pfd)))
返回false;
if(!SetPixelFormat(hDC、PixelFormat和pfd))
返回false;
hRC=wglCreateContext(hDC);
如果(!hRC){

std::cout我找到了答案。SwapBuffer(hDC)命令只是错误发生的地方,但与此无关。我相信我的错误是由于与索引相关的原因造成的,好像我只绘制了模型中的第一个网格,一切正常。Nvidia因此错误崩溃,Intel继续忽略它


尽管如此,感谢Chris Becke使用GetDC(hwnd)指出了未来的内存泄漏.

发布@BDL Done。这很困难,因为代码库很大,我不确定是什么导致了错误。如果这是相关的,我确实会得到一个GL_VALIDATE_状态为false,但没有信息日志。GL_LINK_状态返回true。但是,你应该使用传递给“wglMakecurrent”的HDC调用
SwapBuffers
。@chrisbeke Jus“崩溃”是一个相当模糊的问题描述。它是人们用来描述几乎任何他们无法解释的错误类型的总括短语,从调试输出和失败的断言到未处理的异常和进程终止。请更明确地描述您的问题。