使用GLUT_3_2_CORE_PROFILE

时间:2018-01-14 12:20:57

标签: c++ opengl glut

我在初始化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_PROFILE4.1 ATI-1.51.8。这个较新版本的OpenGL需要进一步初始化吗?

1 个答案:

答案 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是该规范的最新版本,完全支持固定和可编程功能。即便如此,自Ope​​nGL 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规范中定义的功能。