freeglut窗口初始化+ glew 3.0上下文创建不起作用[关闭]

Posted

技术标签:

【中文标题】freeglut窗口初始化+ glew 3.0上下文创建不起作用[关闭]【英文标题】:freeglut window init + glew 3.0 context creation does not work [closed] 【发布时间】:2013-05-24 18:28:11 【问题描述】:

我正在尝试使用 freeglut 创建一个窗口,然后使用 glew 创建一个 3.2 上下文,以便使用现代 OpenGL 函数(使用 c++ 和 Windows pc)。我的问题是上下文创建(我在 freeglut 初始化之前和之后都尝试过)似乎不起作用,每次我尝试使用 glCreateShader 之类的函数时都会遇到访问冲突。

我使用的代码看起来像这样(它位于 int main(int argc, char **argv) 方法的开头):

glutInit(&argc, argv);
glutInitWindowPosition(-1, -1);
glutInitWindowSize(640, 480);
glutInitDisplayMode(GLUT_RGBA || GLUT_DOUBLE || GLUT_DEPTH);

glutCreateWindow("some title");


glewExperimental = GL_TRUE;
GLenum err = glewInit();

 if (GLEW_OK != err)
 
   fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
 
 fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
 if (GLEW_VERSION_3_2)
 
    fprintf(stdout, "OpenGL 3.2 ready", glewGetString(GLEW_VERSION));
 
...
vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER); //<-- Access Violation

此外,glew 初始化代码是从他们的网站 1:1 复制的。 我希望我的错误不是太明显,并且有人找到时间来帮助我。

【问题讨论】:

你确定你的显卡支持吗? 对不起,我没有提到这一点。我是。我有一个带有最新驱动程序的 hd 7950,它应该支持甚至 4.2 所以您的代码显示 OpenGL 3.2 已准备就绪等,但函数崩溃了? Tile 说 3.0,body 说 3.2。你真正想要哪个?核心还是兼容性? 你为什么不用glutInitContext*() and friends? 【参考方案1】:

你有问题:

glutInitDisplayMode(GLUT_RGBA || GLUT_DOUBLE || GLUT_DEPTH);

布尔 OR || 与位 OR | 不同。您想要 OR 位掩码|,而不是布尔值或它们。除此之外,通过这种方式,您将获得 OpenGL-3 兼容性配置文件上下文,而不是核心上下文。

【讨论】:

哦,谢谢。这个错误只是愚蠢的,我真的不知道我为什么这样做......但是我怎样才能创建一个核心上下文? @user1059863: FreeGLUT 提供了一组扩展函数glutInitContextVersion(majorVersion, minorVersion)glutInitContextFlags(flags); flags: GLUT_DEBUG, GLUT_FORWARD_COMPATIBLEglutInitContextProfile(profile); profile: GLUT_CORE_PROFILE ^ GLUT_COMPATIBILITY_PROFILE,如果在调用glutCreateWindow(…)之前设置它们将影响上下文创建使用选定的属性创建上下文。

以上是关于freeglut窗口初始化+ glew 3.0上下文创建不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

0 VS2015 WIN7 配置OPENGL

Win10 VS2015 OpenGL + freeglut + glew + glm 环境配置

创建一个基本的 OpenGL 上下文

OpenGL环境配置 win10,vs2015,glew,freeglut, glm

OPENGL中gladglewglfwFreeglut的区别

客户端程序中的 glewInit() 和 GLEW_ARB_xxx_ 失败