- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我很困惑。要在 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 代表赏金,我会向任何知道问题所在的人免费发送营业执照! (值(value) 99 英镑)
编辑 2:更多细节。以下是已知会失败的卡片列表:
ATI Mobility Radeon HD 5650
ATI Radeon X1600 专业版
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/
我很困惑。要在 Windows 上的 OpenGL 1.x 中使用帧缓冲区对象扩展 (FBO),我应该使用哪些?: wglGetProcAddress("glGenFramebuffers"); //
目前我正在处理 3D 对象渲染。在处理帧缓冲区部分时,我遇到了一些错误。 self.fbo = glGenFramebuffers(1) 每当解释器点击这一行时,它会显示以下错误 **File "C:
我是一名优秀的程序员,十分优秀!