我正在使用SDL 1.3的官方Android端口,并使用它来设置GLES2渲染器。它适用于大多数设备,但对于一个用户而言,它不起作用。日志输出显示以下错误:为什么glGetIntegerv为GL_NUM_SHADER_BINARY_FORMATS生成GL_INVALID_ENUM?
error of type 0x500 glGetIntegerv
我查找了0x500,它引用了GL_INVALID_ENUM。我已经在SDL库中的以下代码中追踪了问题的发生地点:(完整的源代码非常大,我剪掉了日志记录和基本的错误检查行,所以如果我没有在这里包含足够的信息,请告诉我)
glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &nFormats);
glGetBooleanv(GL_SHADER_COMPILER, &hasCompiler);
if(hasCompiler)
++nFormats;
rdata->shader_formats = (GLenum *) SDL_calloc(nFormats, sizeof(GLenum));
rdata->shader_format_count = nFormats;
glGetIntegerv(GL_SHADER_BINARY_FORMATS, (GLint *) rdata->shader_formats);
紧接最后一行(glGetIntegerv为GL_SHADER_BINARY_FORMATS),glGetError()之后返回GL_INVALID_ENUM。
这主要是一种猜测,但在这种情况下,如果我正确读取它,违反规范,这可能意味着设备不支持任何二进制着色器格式(如果GL_NUM_SHADER_BINARY_FORMATS == 0,则'假设'没有人会调用GL_SHADER_BINARY_FORMATS) 。 – harism 2012-01-08 20:09:39
谢谢,这似乎是合理的。我会看看零是否是返回值,并且看看是否跳过这部分将在稍后导致任何其他问题。 – paulscode 2012-01-08 21:39:50
原来GL_NUM_SHADER_BINARY_FORMATS == 1(在上面的代码示例中nFormats变成了2,因为“hasCompiler”为true)。但是,GL_SHADER_BINARY_FORMATS的glGetIntegerv仍然会导致GL_INVALID_ENUM。当问题发生时,我通过告诉代码中存在零着色器二进制格式来解决这个问题,但是我仍然想知道为什么会发生这种情况。尽管非常感谢您的提示,但如果您没有提出建议,可能需要更长的时间才能提出解决方法! – paulscode 2012-01-09 03:04:10