我正在编写一个OpenGL(ES)应用程序,我的设备似乎又回归到软件渲染。如何确定导致此情况发生的API调用/设备限制?
就我而言,这是在使用OpenGL ES 2.0的Raspberry Pi上进行的,但理想的答案应该适用于更广泛的OpenGL版本和操作系统。
答案 0 :(得分:3)
老实说,我认为找不到合适的方法。
显卡驱动程序将为特定版本的OpenGL提供功能,据我所知,它不必为这些功能提供硬件支持,只需能够处理请求它们的应用程序。所以一张卡可以声称支持OpenGL 4,但几乎所有比OpenGL3更新的东西都可以简单地渲染软件。
您可能能够找到您希望运行的硬件的一些文档,它们将告诉您什么是硬件加速。如果做不到这一点,你可能需要简单地尝试建立你慢慢使用的功能列表,直到你开始看到它已经落后于软件渲染。
另外,你怎么知道它正在使用软件渲染,它只是性能受到打击?我想有可能虽然它确实支持硬件功能,但它确实非常糟糕。您也可能无法正确创建上下文,因此无法利用最新版本。
答案 1 :(得分:3)
如果设备支持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);