奇怪的SDL getAttribute()行为

时间:2016-02-27 17:44:36

标签: opengl sdl-2 glew

我指示SDL至少使用8位用于模板缓冲区:

if (SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8) < 0)
{
    printf("couldn't set stencil size: %s\n", SDL_GetError());
}

这是有效的,因为它没有错误。 但是稍后在代码中,我尝试获取模板大小值:

int rc, i;
rc = SDL_GL_GetAttribute(SDL_GL_STENCIL_SIZE, &i);
printf("stencil buffer size: (returns %i):%i  sdl-error:%s\n", rc, i, SDL_GetError());

返回-1,并输出:

stencil buffer size: (returns -1):0  sdl-error:OpenGL error: GL_INVALID_ENUM

如果使用SDL_ClearError()清除任何SDL错误,那么这一定是原因。但我不明白为什么。

可能会出现更大的错误,因为glGetError()在GLEW初始化后立即返回GL_INVALID_ENUM,与SDL给出的错误相同。

注意:感谢@Nicol Bolas,我编辑了错误的电话。

修改 我试图改变上下文版本,最好的版本是3.1,glew没有生成错误,sdl返回8作为模板大小。 但为什么?我读了GLEW更改日志,它说,我的glew版本(1.13.0)应该能够处理opengl 4:http://glew.sourceforge.net/

那么,出了什么问题?

1 个答案:

答案 0 :(得分:0)

由于现在模板工作正常,我只是通过调用glGetError()清除了GLEW生成的错误。对于那些感兴趣的人,这里有关于错误的段落:(链接:https://www.opengl.org/wiki/OpenGL_Loading_Library

  

GLEW在核心环境方面存在问题。它调用glGetString(GL_EXTENSIONS),一旦调用glewInit(),就会在GL 3.2+核心上下文中产生GL_INVALID_ENUM。它也不提取函数指针。解决方案是GLEW使用glGetStringi代替。当前版本的GLEW是1.10.0,但他们仍然无法纠正它。唯一的解决方法是使用glewExperimental for now.glewExperimental是一个已由GLEW定义的变量。在调用glewInit()之前,必须将其设置为GL_TRUE。你可能仍然得到GL_INVALID_ENUM(取决于你使用的GLEW的版本),但至少GLEW忽略glGetString(GL_EXTENSIONS)并获取所有函数指针。