Ash*_*ain 8 c++ windows opengl fbo driver
我糊涂了.要在Windows上的OpenGL 1.x中使用Framebuffer对象扩展(FBO),我使用哪些?:
wglGetProcAddress("glGenFramebuffers");
// or
wglGetProcAddress("glGenFramebuffersEXT");
Run Code Online (Sandbox Code Playgroud)
据我所知,来自不同硬件的用户的报告,一些驱动程序支持所有组合,两者之一或两者兼而有之.
哪个是正确的?有些司机真的支持一个但不支持另一个吗?如果找不到,试图从一个回到另一个是否正确?
编辑: 我仍然遇到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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在启动期间,它会创建一个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);
}
Run Code Online (Sandbox Code Playgroud)
我经历过这段代码的许多变化,我根本无法让它为每个人工作.始终有一组用户根本不报告任何渲染.ATI Radeon HD卡似乎特别成问题.我不确定是否涉及驱动程序错误,但我想我的上述代码更有可能做出错误的假设.
500代表赏金,我将向任何知道错误的人发送免费营业执照!(价值99英镑)
编辑2:更多细节.以下是已知失败的卡片列表:
ATI Mobility Radeon HD 5650
ATI Radeon X1600 Pro
ATI Mobility Radeon HD 4200
实际上没有渲染到纹理.似乎glGenFramebuffers单独的呼叫停止在这些卡上完全呈现.我可以推迟创建FBO到第一次渲染到纹理实际上已经完成,但之后可能会再次停止渲染.
我可以使用GLEW,但是我的代码没有做什么呢?我查看了源代码,它似乎使用了类似的列表wglGetProcAddress.在我的情况下返回方法,否则glGenFramebuffers将为NULL并崩溃.有任何想法吗...?
Tob*_*obi 10
如果存在扩展名GL_EXT_framebuffer_object,则可以使用wglGetProcAddress("glGenFramebuffersEXT");.
如果OpenGL版本> = 3.0(在此版本中FBO扩展名已添加到核心),那么您可以使用wglGetProcAddress("glGenFramebuffers");.