我正在编写一个 OpenGL (ES) 应用程序,我的设备似乎回退到软件渲染。如何确定导致这种情况发生的 API 调用/设备限制?
就我而言,这发生在具有 OpenGL ES 2.0 的 Raspberry Pi 上,但理想的答案应该适用于更广泛的 OpenGL 版本和操作系统。
老实说,我认为没有适当的方法可以找出答案。
显卡驱动程序将为特定版本的 OpenGL 提供功能,据我所知,它不必为这些功能提供硬件支持,只需能够处理您的应用程序请求它们。因此,一张卡可以声称支持 OpenGL 4,但几乎所有比 OpenGL3 更新的东西都可以简单地通过软件渲染。
您可能会找到一些有关您希望在其上运行的硬件的文档,这些文档会告诉您什么是硬件加速。如果做不到这一点,您可能不得不简单地尝试建立您慢慢使用的功能列表,直到您开始看到它已经退回到软件渲染上。
另外,你怎么知道它正在使用软件渲染,只是性能受到影响吗?我想有可能虽然它确实支持硬件中的某个功能,但它的表现非常糟糕。也有可能您一开始就没有正确创建上下文,因此无法利用更新的版本。
如果设备支持 GL_ARB_debug_output 那么调试输出可能会提供一些线索是软件渲染还是对性能不利。
用法在文档http://www.opengl.org/registry/specs/ARB/debug_output.txt中有描述。 简而言之,您应该设置日志缓冲区或接收消息的回调函数。
还有另一个调试扩展http://www.opengl.org/registry/specs/KHR/debug.txt可能还存在一些。
要使用 KHR 扩展,您应该正确初始化上下文
EGLint ctx_attribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR,
EGL_NONE};
EGLContext *ctx = eglCreateContext(dpy, config, EGL_NO_CONTEXT, ctx_attribs);
并设置回调
static void on_gl_error(enum source, enum type, uint id, enum severity,
sizei length, const char* message, void *userParam)
{
printf("%s\n", message);
}
static void enable_debug_callbacks(void)
{
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR, GL_TRUE);
glDebugMessageCallbackKHR(on_gl_error, NULL);
}
其他人可能以类似的方式工作,您应该在尝试之前检查支持的扩展,这是通过检查调用的返回来完成的。它是一个包含所有支持的扩展列表的字符串。
glGetString(GL_EXTENSIONS);