C++ glGetError()在成功获取上下文后始终返回GL\u无效\u操作

C++ glGetError()在成功获取上下文后始终返回GL\u无效\u操作,c++,opengl-es,opengl-es-2.0,egl,C++,Opengl Es,Opengl Es 2.0,Egl,我试图在Windows 7上使用(谷歌的)Angle运行OpenGL ES 2.0,但是无论我把它放在哪里,glGetError()无限返回GL\u无效操作。我被告知它发生在没有上下文的情况下,但我使用的是不会产生错误的EGL 我将assert(eglGetError()==EGL\u SUCCESS)放在每个EGL语句之后只是为了检查,没有错误 但是,这会挂起程序,无论我将其放在何处,即使在eglMakeCurrent()之后: 这是我的EGL设置代码(窗口是一个HWND): 毕竟,我发现问题

我试图在Windows 7上使用(谷歌的)Angle运行OpenGL ES 2.0,但是无论我把它放在哪里,
glGetError()
无限返回
GL\u无效操作
。我被告知它发生在没有上下文的情况下,但我使用的是不会产生错误的EGL

我将
assert(eglGetError()==EGL\u SUCCESS)
放在每个EGL语句之后只是为了检查,没有错误

但是,这会挂起程序,无论我将其放在何处,即使在
eglMakeCurrent()
之后:

这是我的EGL设置代码(
窗口是一个
HWND
):


毕竟,我发现问题在于窗口和输入变量之间的分辨率不匹配,不知怎么的,EGL没有发现,但GL知道存在问题。我仍然想知道为什么会发生这样的事情,以及我如何才能防止这样的事情发生

为了确定这一点,我花了大量时间分析谷歌的示例代码,发现它们初始化EGL的方式非常不同。如果这对某人有帮助,下面是Google如何在他们的
角度中初始化EGL的示例:


PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = reinterpret_cast(eglGetProcAddress("eglGetPlatformDisplayEXT"));
if(!eglGetPlatformDisplayEXT) {
    ...
}
const EGLint displayAttributes[] = {
    EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE,
    EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE,
    EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE,
    EGL_NONE
};
mainWindowDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, display, &displayAttributes[0]);
if(mainWindowDisplay == EGL_NO_DISPLAY) {
    ...
}

EGLint majorVersion, minorVersion;
if(eglInitialize(mainWindowDisplay, &majorVersion, &minorVersion) == EGL_FALSE) {
    ...
}

const char *displayExtensions = eglQueryString(mainWindowDisplay, EGL_EXTENSIONS);
bool hasKHRCreateContext = strstr(displayExtensions, "EGL_KHR_create_context") != nullptr;
if((majorVersion != 2 || minorVersion != 0) && !hasKHRCreateContext) {
    ...
}

eglBindAPI(EGL_OPENGL_ES_API);
if(eglGetError() != EGL_SUCCESS) {
    ...
}

const EGLint configAttributes[] = {
    EGL_RED_SIZE,       8,
    EGL_GREEN_SIZE,     8,
    EGL_BLUE_SIZE,      8,
    EGL_ALPHA_SIZE,     8,
    EGL_DEPTH_SIZE,     24,
    EGL_STENCIL_SIZE,   8,
    EGL_SAMPLE_BUFFERS, 0,
    EGL_NONE
};
EGLConfig graphicsConfig;
EGLint configCount;
if(!eglChooseConfig(mainWindowDisplay, configAttributes, &graphicsConfig, 1, &configCount) || (configCount != 1)) {
    ...
}

EGLint surfaceAttributes[] = {
    EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_TRUE,
    EGL_NONE
};
if(strstr(displayExtensions, "EGL_NV_post_sub_buffer") == nullptr) {
    surfaceAttributes[0] = EGL_NONE;
}
mainWindowSurface = eglCreateWindowSurface(mainWindowDisplay, graphicsConfig, window, &surfaceAttributes[0]);
if(eglGetError() != EGL_SUCCESS) {
    ...
}
assert(mainWindowSurface != EGL_NO_SURFACE);

EGLint contextAttributes[] = {
    EGL_CONTEXT_MAJOR_VERSION_KHR, 2,
    EGL_CONTEXT_MINOR_VERSION_KHR, 0,
    EGL_NONE
};
if(!hasKHRCreateContext) {
    contextAttributes[0] = EGL_CONTEXT_CLIENT_VERSION;
    contextAttributes[2] = EGL_NONE;
}
mainWindowContext = eglCreateContext(mainWindowDisplay, graphicsConfig, nullptr, &contextAttributes[0]);
if(eglGetError() != EGL_SUCCESS) {
    ...
}

eglMakeCurrent(mainWindowDisplay, mainWindowSurface, mainWindowSurface, mainWindowContext);
if(eglGetError() != EGL_SUCCESS) {
    ...
}

所以,请恕我直言,因为我不是跨平台opengl的专家。但是,我的理解是,角度已经集成到SDL2中了?所以对我来说,使用SDL2并从SDL2请求opengles2上下文就足够了,当它在windows上时,ANGLE将被隐式使用?SDL2论坛上有几篇关于这一点的帖子:这可能无法回答您的问题,但可能会有所帮助anyways@Chris-在寻找我问题的答案时,我看到一些帖子提到SDL的一个版本有时使用角度,但并不总是这样。但我不想使用它,因为我不喜欢额外的依赖项,也不需要SDL提供的其他功能。EGL是一个完美的适合我,假设我可以得到它的工作。最糟糕的情况是我必须回到WGL+XGL的跨平台,你可以试着看看SDL代码,看看它们是如何使用Angle的,你链接的是什么库?只需从Angle(从Google的Git编译而来)查看
libEGL
libGLESv2
。我用来源提供的样品测试了它们

    mainDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    if(mainDisplay == EGL_NO_DISPLAY) {
        ...
    }
    if(eglInitialize(mainDisplay, NULL, NULL) != EGL_TRUE) {
        ...
    }
    eglBindAPI(EGL_OPENGL_ES_API);
    EGLConfig bestConfiguration;
    EGLint numConfigurationsAvailable;
    if(!eglChooseConfig(mainDisplay, openGLConfigurationAttributes, &bestConfiguration, 1, &numConfigurationsAvailable)) {
        ...
    }
    const EGLint surfaceBaseAttributes[] = { EGL_NONE };
    displaySurface = eglCreateWindowSurface(mainDisplay, bestConfiguration, window, surfaceBaseAttributes);
    if(displaySurface == EGL_NO_SURFACE) {
        ...
    }
    const EGLint contextBaseAttributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
    openGLContext = eglCreateContext(mainDisplay, bestConfiguration, EGL_NO_CONTEXT, contextBaseAttributes);
    if(openGLContext == EGL_NO_CONTEXT) {
        ...
    }
    if(eglMakeCurrent(mainDisplay, displaySurface, displaySurface, openGLContext) != EGL_TRUE) {
        ...
    }


PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = reinterpret_cast(eglGetProcAddress("eglGetPlatformDisplayEXT"));
if(!eglGetPlatformDisplayEXT) {
    ...
}
const EGLint displayAttributes[] = {
    EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE,
    EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE,
    EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE,
    EGL_NONE
};
mainWindowDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, display, &displayAttributes[0]);
if(mainWindowDisplay == EGL_NO_DISPLAY) {
    ...
}

EGLint majorVersion, minorVersion;
if(eglInitialize(mainWindowDisplay, &majorVersion, &minorVersion) == EGL_FALSE) {
    ...
}

const char *displayExtensions = eglQueryString(mainWindowDisplay, EGL_EXTENSIONS);
bool hasKHRCreateContext = strstr(displayExtensions, "EGL_KHR_create_context") != nullptr;
if((majorVersion != 2 || minorVersion != 0) && !hasKHRCreateContext) {
    ...
}

eglBindAPI(EGL_OPENGL_ES_API);
if(eglGetError() != EGL_SUCCESS) {
    ...
}

const EGLint configAttributes[] = {
    EGL_RED_SIZE,       8,
    EGL_GREEN_SIZE,     8,
    EGL_BLUE_SIZE,      8,
    EGL_ALPHA_SIZE,     8,
    EGL_DEPTH_SIZE,     24,
    EGL_STENCIL_SIZE,   8,
    EGL_SAMPLE_BUFFERS, 0,
    EGL_NONE
};
EGLConfig graphicsConfig;
EGLint configCount;
if(!eglChooseConfig(mainWindowDisplay, configAttributes, &graphicsConfig, 1, &configCount) || (configCount != 1)) {
    ...
}

EGLint surfaceAttributes[] = {
    EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_TRUE,
    EGL_NONE
};
if(strstr(displayExtensions, "EGL_NV_post_sub_buffer") == nullptr) {
    surfaceAttributes[0] = EGL_NONE;
}
mainWindowSurface = eglCreateWindowSurface(mainWindowDisplay, graphicsConfig, window, &surfaceAttributes[0]);
if(eglGetError() != EGL_SUCCESS) {
    ...
}
assert(mainWindowSurface != EGL_NO_SURFACE);

EGLint contextAttributes[] = {
    EGL_CONTEXT_MAJOR_VERSION_KHR, 2,
    EGL_CONTEXT_MINOR_VERSION_KHR, 0,
    EGL_NONE
};
if(!hasKHRCreateContext) {
    contextAttributes[0] = EGL_CONTEXT_CLIENT_VERSION;
    contextAttributes[2] = EGL_NONE;
}
mainWindowContext = eglCreateContext(mainWindowDisplay, graphicsConfig, nullptr, &contextAttributes[0]);
if(eglGetError() != EGL_SUCCESS) {
    ...
}

eglMakeCurrent(mainWindowDisplay, mainWindowSurface, mainWindowSurface, mainWindowContext);
if(eglGetError() != EGL_SUCCESS) {
    ...
}