1

我正在编写一个 OpenGL (ES) 应用程序,我的设备似乎回退到软件渲染。如何确定导致这种情况发生的 API 调用/设备限制?

就我而言,这发生在具有 OpenGL ES 2.0 的 Raspberry Pi 上,但理想的答案应该适用于更广泛的 OpenGL 版本和操作系统。

4

2 回答 2

3

老实说,我认为没有适当的方法可以找出答案。

显卡驱动程序将为特定版本的 OpenGL 提供功能,据我所知,它不必为这些功能提供硬件支持,只需能够处理您的应用程序请求它们。因此,一张卡可以声称支持 OpenGL 4,但几乎所有比 OpenGL3 更新的东西都可以简单地通过软件渲染。

您可能会找到一些有关您希望在其上运行的硬件的文档,这些文档会告诉您什么是硬件加速。如果做不到这一点,您可能不得不简单地尝试建立您慢慢使用的功能列表,直到您开始看到它已经退回到软件渲染上。

另外,你怎么知道它正在使用软件渲染,只是性能受到影响吗?我想有可能虽然它确实支持硬件中的某个功能,但它的表现非常糟糕。也有可能您一开始就没有正确创建上下文,因此无法利用更新的版本。

于 2013-06-28T06:14:59.733 回答
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);
于 2013-06-28T07:25:34.067 回答