我指示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/
那么,出了什么问题?
答案 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)并获取所有函数指针。