使用 GLFW + GLEW 时 glGenFramebuffers() 访问冲突
Posted
技术标签:
【中文标题】使用 GLFW + GLEW 时 glGenFramebuffers() 访问冲突【英文标题】:glGenFramebuffers() access violation when using GLFW + GLEW 【发布时间】:2013-03-01 20:00:32 【问题描述】:我收到此错误:
“访问冲突执行位置 0x00000000。”
当我在 Windows 上使用 GLFW + GLEW 时。
我使用的是 Windows 7。我也有自己的实现(从头开始),它创建一个窗口、初始化 OpenGL 上下文、初始化 GLEW 等......一切正常。所以当然我的视频卡具有帧缓冲区功能,并且驱动程序一切都很好......只有当我尝试使用 GLFW 时才会出现问题。
有什么建议吗?
代码:
void start()
if( !glfwInit() )
glfwTerminate();
throw exception( "Failed to initialize GLFW" );
glfwOpenWindowHint( GLFW_FSAA_SAMPLES, 4 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MAJOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MINOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
if( !glfwOpenWindow( m_width, m_height, 0, 0, 0, 0, 32, 0, GLFW_WINDOW ) )
throw exception( "Failed to open GLFW window." );
glfwTerminate();
if ( glewInit() != GLEW_OK )
throw exception( "Failed to initialize GLEW" );
// texture
glGenTextures( 1, &m_texture );
glBindTexture( GL_TEXTURE_2D, m_texture );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
// frame buffer
glGenFramebuffers( 1, &m_frameBuffer ); // IT CRASHES HERE! :-(
glBindFramebuffer( GL_FRAMEBUFFER, m_frameBuffer );
glBindTexture( GL_TEXTURE_2D, m_texture );
...
【问题讨论】:
所以你想告诉我你自己实现了 OpenGL,因为你说你从头开始有自己的实现? 您能否向我们展示一些代码以及您的初始化代码在发生这种情况的位置或附近? 大声笑......对不起......我忘记了一些词......我会修复它...... 我也这么认为。您可以在初始化期间显示您的 GLFW 调用吗? 【参考方案1】:GLEW 在使用核心 OpenGL 配置文件时存在已知问题。您可以使用 the GLEW workaround 或放弃 GLEW 使用 extension loaders that actually work。
【讨论】:
好!我可以使用你的建议绕过它......它不再崩溃,但我的渲染让所有东西都变黑了。也许这是另一个问题......我会更深入地检查一下!谢谢 仅供参考,glew 中的错误仍然存在。【参考方案2】:我只是偶然发现了同样的问题。 解决方案:使用glGenFramebuffers的instad使用“glGenFramebuffersEXT”和on 任何其他与帧缓冲区有关的函数总是将“EXT”放在它的末尾,它应该可以工作。问题就在这里,存在两个版本的扩展,即 ARB 版本和 EXT 版本,如果你不写“EXT”,你使用“ARB”版本,它几乎都是一样的,但它是一部分 较新的 gl 版本的核心配置文件。所以为了兼容,总是使用函数的“EXT”版本:-)
【讨论】:
我现在完全不建议使用此功能的 EXT 变体。 ARB API 更加简洁,并且在支持 GL 2.x 的实现中也可以广泛使用。 @J-MAN glew.h 还将 glGenFrameBuffersEXT 定义为一个宏,所以它仍然像我一样崩溃。 @J-MAN 我的问题是我没有调用 glewInit()。以上是关于使用 GLFW + GLEW 时 glGenFramebuffers() 访问冲突的主要内容,如果未能解决你的问题,请参考以下文章
带有 GLFW 和 GLEW 的 OpenGL 应用程序崩溃