glGenFramebuffers或glGenFramebuffersEXT?

我很困惑。 要在Windows上使用OpenGL 1.x中的Framebuffer Object扩展(FBO),可以使用哪些?

wglGetProcAddress("glGenFramebuffers"); // or wglGetProcAddress("glGenFramebuffersEXT"); 

就我从使用不同硬件的用户的报告中可以看出,一些驱动程序支持所有的组合,既不是一个,也不是两者中的一个。

哪一个是正确的? 一些司机真的支持一个,而不是另一个? 如果没有find,试图从一个回落到另一个是否正确?


编辑:我仍然有严重的问题与ATI Radeon显卡和周围的代码。 我们刚刚使用这个代码(www.scirra.com)推出了一个商业编辑器。 看来不pipe我用什么代码组合来使用FBO,一些不同的用户组合报告他们什么都看不到(即没有呈现)。

这里是我检测是否使用ARB函数(无后缀)或EXT后缀函数的代码。 这在启动时运行:

 gl_extensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)); gl_vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); gl_renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER)); gl_version = reinterpret_cast<const char*>(glGetString(GL_VERSION)); gl_shading_language = reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION)); // If OpenGL version >= 3, framebuffer objects are core - enable regardless of extension // (the flags are initialised to false) if (atof(gl_version) >= 3.0) { support_framebuffer_object = true; support_framebuffer_via_ext = false; } else { // Detect framebuffer object support via ARB (for OpenGL version < 3) - also uses non-EXT names if (strstr(gl_extensions, "ARB_framebuffer_object") != 0) { support_framebuffer_object = true; support_framebuffer_via_ext = false; } // Detect framebuffer object support via EXT (for OpenGL version < 3) - uses the EXT names else if (strstr(gl_extensions, "EXT_framebuffer_object") != 0) { support_framebuffer_object = true; support_framebuffer_via_ext = true; } } 

然后在启动过程中,它会创build一个FBO,预期将渲染为纹理:

 // Render-to-texture support: create a frame buffer object (FBO) if (support_framebuffer_object) { // If support is via EXT (OpenGL version < 3), add the EXT suffix; otherwise functions are core (OpenGL version >= 3) // or ARB without the EXT suffix, so just get the functions on their own. std::string suffix = (support_framebuffer_via_ext ? "EXT" : ""); glGenFramebuffers = (glGenFramebuffers_t)wglGetProcAddress((std::string("glGenFramebuffers") + suffix).c_str()); glDeleteFramebuffers = (glDeleteFramebuffers_t)wglGetProcAddress((std::string("glDeleteFramebuffers") + suffix).c_str()); glBindFramebuffer = (glBindFramebuffer_t)wglGetProcAddress((std::string("glBindFramebuffer") + suffix).c_str()); glFramebufferTexture2D = (glFramebufferTexture2D_t)wglGetProcAddress((std::string("glFramebufferTexture2D") + suffix).c_str()); glCheckFramebufferStatus = (glCheckFramebufferStatus_t)wglGetProcAddress((std::string("glCheckFramebufferStatus") + suffix).c_str()); glGenerateMipmap = (glGenerateMipmap_t)wglGetProcAddress((std::string("glGenerateMipmap") + suffix).c_str()); // Create a FBO in anticipation of render-to-texture glGenFramebuffers(1, &fbo); } 

我已经通过了这个代码的许多变种,我根本无法让它为每个人工作。 总是有一组用户不报告任何呈现。 ATI Radeon HD卡似乎特别有问题。 我不确定是否存在驱动程序错误,但是我想上面的代码更有可能做出错误的假设。

500代表奖金,我会发送免费的营业执照给任何人谁知道什么是错的! (价值99英镑)


编辑2:一些更多的细节。 以下是已知失败的卡片列表:

ATI Mobility Radeon HD 5650

ATI Radeon X1600 Pro

ATI Mobility Radeon HD 4200

没有渲染纹理实际上完成。 看来glGenFramebuffers调用完全停止在这些卡上渲染。 我可以推迟FBO的创build,第一次渲染到纹理实际上已经完成,但是大概它会停止再次渲染。

我可以使用GLEW,但是我的代码不能做什么? 我看了一下源代码,似乎使用了wglGetProcAddress类似的列表。 方法正在我的情况下返回,否则glGenFramebuffers将是NULL和崩溃。 有任何想法吗…?

如果扩展GL_EXT_framebuffer_object存在,那么你可以使用wglGetProcAddress("glGenFramebuffersEXT");

如果OpenGL版本> = 3.0(在这个版本中,FBO扩展被添加到核心),那么你可以使用wglGetProcAddress("glGenFramebuffers");

你所包含的代码不是问题。 当然,这个绑定点应该像你已经做的那样获得。

在支持ARB_framebuffer_object的情况下,使用没有EXT后缀的入口点。 在支持EXT_framebuffer_object的情况下,使用具有EXT后缀的入口点。 如果两者都支持,则可以通过获取正确的绑定点来选择实现。

我对这个问题非常感兴趣(因为我有类似的疑问,因为你)。

如果您将ARB规格与EXT规格进行比较,您可以注意到很多差异。

在这里,我将引用这个话题中最有趣的ARB规范段落。

规范是非常漫长的,但ARB变体包含许多关于EXT兼容性问题的讨论。 由于您是应用程序运行,所以入口点可能是正确的,并且错误(如Nicolas Bolas所建议的)可能在帧缓冲区中是完整的。

介绍每一个可能的检查,并仔细检查实施两次(一个考虑ARB规格,一个考虑EXT规格)。


EXT_framebuffer_object包含哪些附加功能?

  Currently we incorporate the following layered extensions: * EXT_framebuffer_multisample * EXT_framebuffer_blit * EXT_packed_depth_stencil 

以及以下功能:

  * Permit attachments with different width and height (mixed dimensions) * Permit color attachments with different formats (mixed formats). * Render to 1 and 2 component R/RG formats that are provided via the ARB_texture_rg extension. L/A/LA/I will be left for a separate (trivial) extension. * Gen'ed names must be used for framebuffer objects and renderbuffers. * Added FramebufferTextureLayer. ... 

与EXT_framebuffer_object有什么不同呢?

  * Framebuffer completeness only considers the attachments named by DRAW_BUFFERi and READ_BUFFER. Any other attachments do not affect framebuffer completeness. (In EXT_framebuffer_object, all attachments affected framebuffer completeness, independent of the DRAW_BUFFERi and READ_BUFFER state.) * Added new queries for the sizes of the bit planes for color, depth and stencil attachments at a framebuffer attachment point. * Added new queries for framebuffer attachment component type and color encoding. * Many other minor tweaks to synchronize with the GL3 framebuffer objects. * ARB FBOs are not shareable. 

这个扩展和EXT_framebuffer_object都有“绑定帧缓冲”功能(BindFramebuffer和BindFramebufferEXT)。 这两个函数的功能有什么不同吗?

  RESOLVED: Yes. Both extensions will create a new framebuffer object if called with an unused name. However, BindFramebuffer defined in this extension will generate an INVALID_OPERATION error if the name provided has not been generated by GenFramebuffer. That error did not exist in EXT_framebuffer_object, and this extension does not modify the behavior of BindFramebufferEXT. This difference also applies to BindRenderbuffer from this extension vs. BindRenderbufferEXT from EXT_framebuffer_object.