我在初始化GLUT时使用GLUT_3_2_CORE_PROFILE
尝试使用更新版本的OpenGL而不是默认2.1。但是,这会导致第一个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需要进一步初始化吗?
答案 0 :(得分: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的方法。尝试了几种技术,它已经在Core和Compatibility上下文之间进行了划分。
请参阅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规范中定义的功能。