OpenGL 3.1上下文创建后的GL_INVALID_ENUM/GL_INVALID_OPERATION

GL_INVALID_ENUM/GL_INVALID_OPERATION after OpenGL 3.1 context creation

本文关键字:GL INVALID OPERATION ENUM 上下文 创建 OpenGL      更新时间:2023-10-16

我还有一个希望不是那么愚蠢的问题——我想清理一些从OpenGL1.3更新到3.1的旧代码。因此,在最后一步中,我将上下文创建更改为如下内容(下面是自己的代码):https://www.opengl.org/wiki/Tutorial:_OpenGL_3.1_The_First_Triangle_%28C%2B%2B/Win%29

我使用的是GLEW 1.13.0,如果我在旧的上下文创建之外只做glewInit,一切都很好,但在切换到纯3.1上下文后:

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); is giving me GL_INVALID_ENUM
glAlphaFunc( GL_GREATER, 0.5 ); is giving me GL_INVALID_OPERATION
glDisable( GL_ALPHA_TEST ); is giving me GL_INVALID_ENUM
glEnable(GL_NORMALIZE); is giving me GL_INVALID_ENUM

从我读到的内容来看,这些都没有在OpenGL3.1中被弃用——我错过了什么?

目前看起来是这样的:

hWnd = (HWND)GetWindow();
hDC = GetDC( hWnd );
INT DesiredColorBits   = 32;
INT DesiredStencilBits = 8;
INT DesiredDepthBits   = 24;
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = DesiredColorBits;
pfd.cDepthBits = DesiredDepthBits;
pfd.iLayerType = PFD_MAIN_PLANE;
pfd.cStencilBits = DesiredStencilBits;
INT nPixelFormat = ChoosePixelFormat( hDC, &pfd );
printf("Using pixel format %i", nPixelFormat);
if (!SetPixelFormat( hDC, nPixelFormat, &pfd ))
    return 0;
hRC = wglCreateContext( hDC );
wglMakeCurrent(hDC, hRC);
//init glew
glewExperimental = GL_TRUE;
GLenum err = glewInit();
if (GLEW_OK != err)
     return 0;
INT MajorVersion=3;
INT MinorVersion=1;
if (WGLEW_ARB_create_context && WGLEW_ARB_pixel_format)
{
    memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
    pfd.nSize= sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion   = 1;
    pfd.dwFlags    = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;
    pfd.cDepthBits = 24;
    pfd.iLayerType = PFD_MAIN_PLANE;
    const INT iPixelFormatAttribList[] =
    {
        WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
        WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
        WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
        WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
        WGL_COLOR_BITS_ARB, DesiredColorBits,
        WGL_DEPTH_BITS_ARB, DesiredDepthBits,
        WGL_STENCIL_BITS_ARB, DesiredStencilBits,
        0 // End of attributes list
    };
    INT iContextAttribs[] =
    {
        WGL_CONTEXT_MAJOR_VERSION_ARB, MajorVersion,
        WGL_CONTEXT_MINOR_VERSION_ARB, MinorVersion,
        WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
        0 // End of attributes list
    };
    INT iPixelFormat, iNumFormats;
    wglChoosePixelFormatARB(hDC, iPixelFormatAttribList, NULL, 1, &iPixelFormat, (UINT*)&iNumFormats);
    // pfd oldstyle crap...
    if (!SetPixelFormat(hDC, iPixelFormat, &pfd))
        return 0;
    hRC = wglCreateContextAttribsARB(hDC, 0, iContextAttribs);
}
if(hRC) 
{
    printf("GL_VENDOR     : %s", glGetString(GL_VENDOR));
    printf("GL_RENDERER   : %s", glGetString(GL_RENDERER));
    printf("GL_VERSION    : %s", glGetString(GL_VERSION));
    printf("GLEW Version  : %s", glewGetString(GLEW_VERSION));
    wglMakeCurrent(hDC, hRC);
}
else 
    return 0;

我去掉了代码,如果我错过了什么,很抱歉,但上下文已经初始化,我得到了:

Using pixel format 9
GL_VENDOR     : NVIDIA Corporation
GL_RENDERER   : GeForce GT 740M/PCIe/SSE2
GL_VERSION    : 4.4.0
GLEW Version  : 1.13.0

代码中的第一部分初始化了旧式上下文,以便初始化GLEW,尽管我对3.1创建中的PFD部分有点不确定(尽管许多示例都是这样显示的)。尽管如此,我还是从不同的示例和教程中尝试了一些不同的变体,在尝试设置上述状态时,总是会产生GL_INVALID_OPERATION和GL_INVALID _ENUM。

GL_PERSPECTIVE_CORRECTION_HINT不再在核心中,也不在3.1中。有关详细信息,请参阅OpenGL wiki,但3.1中允许的枚举(在4.5之前保持不变)为:

  • GL_LINE_SMOOTH_HINT
  • GL_POLYGON_SMOOTH_HINT
  • GL_TEXTURE_COMPRESSION_HINT
  • GL_FRAGMENT_SHADER_DERIVATIVE_HINT

话虽如此,不要为创建3.1上下文而烦恼。如果可以的话,选择4.4/4.5,如果你想支持上一代,3.3是合理的最低值。