我很困惑。要在Windows的OpenGL 1.x中使用帧缓冲对象扩展(FBO),我应使用以下哪项?:

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

据我从具有不同硬件的用户的报告中所知,某些驱动程序既不支持任何一种,也支持两者之一或两者的所有组合。

哪个是合适的使用?某些驱动程序确实支持其中一种,但不支持另一种吗?如果找不到,尝试从一个回退到另一个是正确的吗?

编辑:我仍然在使用ATI Radeon卡及其相关代码方面遇到严重问题。我们刚刚使用此代码启动了商业编辑器(www.scirra.com)。似乎无论我使用哪种代码组合来使用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;
    }
}

然后稍后在启动过程中,它会创建一个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 rep赏金,我将免费向任何知道怎么回事的人发送营业执照! (值(value)99英镑)

编辑2:更多细节。这是已知失败的卡的列表:

ATI Mobility Radeon HD 5650

ATI Radeon X1600 Pro

ATI Mobility Radeon HD 4200

实际上没有渲染到纹理。似乎glGenFramebuffers调用本身完全停止了在这些卡上的渲染。我可以将FBO的创建推迟到第一次真正完成“渲染到纹理”时,但是据推测,它将再次停止渲染。

我可以使用GLEW,但是我的代码没有做什么呢?我查看了源代码,似乎使用了类似的wglGetProcAddress列表。在我的情况下,将返回方法,否则glGenFramebuffers将为NULL并崩溃。有任何想法吗...?

最佳答案

如果存在扩展名GL_EXT_framebuffer_object,则可以使用wglGetProcAddress("glGenFramebuffersEXT");

如果OpenGL版本> = 3.0(在此版本中,FBO扩展已添加到核心),则可以使用wglGetProcAddress("glGenFramebuffers");

关于c++ - glGenFramebuffers或glGenFramebuffersEXT?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6912988/

10-08 21:13