glGenQueries 总是返回非查询对象,glBeginQuery 返回错误

Posted

技术标签:

【中文标题】glGenQueries 总是返回非查询对象,glBeginQuery 返回错误【英文标题】:glGenQueries always return non-query objects, glBeginQuery return error 【发布时间】:2017-03-25 17:55:51 【问题描述】:

我正在尝试使用 openGL 3.3、使用 GLFW、GLEW 创建遮挡查询

加载函数:

uint32_t glQueryID;
glGenQueries(1, &glQueryID);
if (glIsQuery(glQueryID)) //just for testing its always false !

 ... it must be always true !?!

绘制函数:

glBeginQuery(GL_ANY_SAMPLES_PASSED, glQueryID);
glGetError();// 1282 invalid operation

但是我所有其他 glCalls 都正常工作,没有任何错误

在 Mac OS X、intel HD 4000 上运行

【问题讨论】:

您坚持询问 OpenGL 是否按照您的要求做的事情有什么原因吗? 你不喜欢 OpenGL,调用glGenFoo 不会生成任何Foo,实际上只有第一次绑定/使用它们? 哈哈哈,是的,我喜欢它,是的,这就是原因!谢谢 【参考方案1】:

来自glIsQuery的文档:

glIsQuery 如果 id 当前是查询对象的名称,则返回 GL_TRUE。如果 id 为零,或者是当前不是查询对象名称的非零值,或者如果发生错误,则 glIsQuery 返回 GL_FALSE。

由 glGenQueries 返回但尚未通过调用 glBeginQuery 与查询对象关联的名称不是查询对象的名称。

由于您在向其分配查询对象之前调用glIsQuery(例如通过调用glBeginQuery),因此返回值必须是GL_FALSE

【讨论】:

非常感谢,我想提一下,问题是通过用空开始和结束初始化查询来解决的。我不知道无效操作错误的原因是什么glGenQueries(1, &glQueryID); glBeginQuery(GL_SAMPLES_PASSED, glQueryID); glEndQuery(GL_SAMPLES_PASSED);【参考方案2】:

通过初始化查询,然后是空的开始/结束查询来解决问题

glGenQueries(1, &glQueryID);
glBeginQuery(GL_SAMPLES_PASSED, glQueryID);
glEndQuery(GL_SAMPLES_PASSED);

这将在稍后绘制时修复错误 1282(无效操作)

【讨论】:

以上是关于glGenQueries 总是返回非查询对象,glBeginQuery 返回错误的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA:查询如何返回非实体对象或对象列表?

执行立即更新返回 NULL 而非字符串查询工作正常

一种GL error 501的原因和解决 ----no default precision defined引起

一种GL error 501的原因和解决 ----no default precision defined引起

查询自己OpenGL的版本信息

有没有办法构造一个 Q 对象,它代表一个 EmptyQueryset,即总是返回一个空结果?