使用 GLUT_3_2_CORE_PROFILE 时出现 OpenGL 错误 1282(无效操作)

Posted

技术标签:

【中文标题】使用 GLUT_3_2_CORE_PROFILE 时出现 OpenGL 错误 1282(无效操作)【英文标题】:OpenGL error 1282 (invalid operation) when using GLUT_3_2_CORE_PROFILE 【发布时间】:2018-01-14 12:20:57 【问题描述】:

我正在尝试在我的 Mac 上使用比默认 2.1 更新的 OpenGL 版本,方法是在初始化 GLUT 时使用 GLUT_3_2_CORE_PROFILE。但是,这会导致第一个 OpenGL 操作因无效操作而失败。调用这个第一个函数之前没有报错,没有GLUT_3_2_CORE_PROFILE也没有报错。

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_3_2_CORE_PROFILE | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(500, 500);
glutCreateWindow("Demo");
glutDisplayFunc(displayListener);

errorCheck();
glMatrixMode(GL_PROJECTION);
errorCheck();

errorCheck的内容很简单:

GLenum error;
while ((error = glGetError())) 
    std::cout << "OpenGL error " << error << ": " << gluErrorString(error);

根据标题,错误 1282 仅由第二次调用 errorCheck 产生:

OpenGL error 1282: invalid operation

版本字符串报告为2.1 ATI-1.51.8,不带GLUT_3_2_CORE_PROFILE,带4.1 ATI-1.51.8。在这个较新版本的 OpenGL 中是否需要进一步初始化?

【问题讨论】:

那是因为您的第一个 OpenGL 操作在 3.2 核心配置文件中无效...(您知道什么是 3.2 核心配置文件,还是因为有人说您才设置此选项?应该?) 我已将其设置为使用新的着色器功能,所以两者兼而有之 【参考方案1】:

glMatrixMode 是已弃用的Fixed Function Pipeline 的一部分,在 OpenGL 3.2 核心配置文件中不可用。

GLUT 使用 Legacy Profile 作为所有创建的 OpenGL 上下文的默认设置。你必须省略GLUT_3_2_CORE_PROFILE:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

您必须将自己限制在核心配置文件功能中

核心配置文件和前向兼容模式的详细规格和区别可以在OpenGL specification - Khronos OpenGL registry找到

见Khronos wiki - OpenGL Context:

OpenGL 3.0 版引入了弃用功能的想法。许多 OpenGL 函数被声明为弃用,这意味着用户应该避免使用它们,因为它们可能会从更高的 API 版本中删除。 OpenGL 3.1 删除了几乎所有在 OpenGL 3.0 中弃用的功能。这包括Fixed Function Pipeline。

....

在 OpenGL 3.1 发布时引入了一个新的扩展,ARB_compatibility。此扩展的存在是向用户发出的信号,即弃用或删除的功能仍可通过原始入口点和枚举使用。这种实现的行为是用一个单独的、更大的OpenGL Specification 定义的。因此,存在向后兼容的规范和非向后兼容的规范。 但是,由于许多实现无论如何都支持已弃用和删除的功能,因此一些实现希望能够为更高 GL 版本的用户提供一种访问旧 API 的方法。尝试了几种技术,最终确定了核心和兼容性上下文之间的划分。

见Khronos wiki - Fixed Function Pipeline:

OpenGL 3.0 是该规范的最后一个版本,它完全支持固定和可编程功能。即便如此,自 OpenGL 2.0 一代以来的大多数硬件都缺乏实际的固定功能硬件。相反,固定功能的进程由系统构建的着色器模拟。 在 OpenGL 3.2 中,Core Profile 缺少这些固定功能概念。兼容性配置文件使它们保持不变。但是,大多数 OpenGL 的新功能无法与固定功能一起使用,即使理论上它们似乎可以交互。

见Khronos wiki - Legacy OpenGL:

2008 年,OpenGL 规范 3.0 版发布。在此版本中,Fixed Function Pipeline 以及大多数相关的 OpenGL 函数和常量被声明为弃用。这些已弃用的元素和概念现在通常称为旧版 OpenGL。 某些支持核心 OpenGL 3.1 或更高版本以及 GL_ARB_compatibility 扩展的实现仍然支持旧版 OpenGL。不公开此扩展的实现仅提供实现所基于的核心 OpenGL 规范中定义的功能。

【讨论】:

以上是关于使用 GLUT_3_2_CORE_PROFILE 时出现 OpenGL 错误 1282(无效操作)的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学_图元的属性_3_OpenGL颜色函数(上)

OPENGL中执行时显示_glutInitWithExit无法定位于动态链接库glut32.dll上

OpenGL glut库

这些'未定义的对 __glut*WithExit' OpenGL 链接器错误的引用是啥意思? [复制]

无法定位程序输入点 _glutCreateWindowWithExit于动态链接库glut32.dll上

计算机图形学输出图元_16_字符函数