Opengl咬合剔除巨大的性能下降

你好,我尝试使用java&lwjgl在opengl中实现occlusiong剔除我的引擎。 阻挡的作品,但…性能下降是巨大的我的意思是从60-70帧/秒到3-6帧/秒。 这是我的问题我做错了什么? 这是我的代码:

//this code is after frustrum culling if object passed glColorMask(false, false, false, false); glDepthMask(false); glBeginQuery(GL_SAMPLES_PASSED, query_id); //renderable is cube not normal object renderable.render(); glEndQuery(GL_SAMPLES_PASSED); int iSamplesPassed = GL15.glGetQueryObjecti(query_id, GL15.GL_QUERY_RESULT); if(iSamplesPassed == 0) { //object is not visible don't render it renderable.setVisible(false); } glColorMask(true, true, true, true); glDepthMask(true); 

query_id是简单的:

 query_id = glGenQueries(); //it is called only once on start 

我看一些例子,我没有看到代码中的任何差异。 只有不同的是他们和我的帧率。

您正在使用glGetQueryObjecti()调用拖延GL管道 。 该stream水线帮助OpenGL快速渲染,因为它可以让你调用新的function,而以前的function仍在执行。 但是,在某些情况下,例如当您执行glGet*()调用时,需要等待所有以前的调用完成才能返回结果。 stream水线延迟非常糟糕,正如你自己所经历的那样,等待遮挡查询返回比实际渲染对象要慢很多。 这发生在你画的每一个物体上。 这打破了管道的目的,需要加以解决。

一个解决scheme可能是并行发送N查询,然后调用glGetQueryObjecti N次。 这将把减速的次数除以N 另一个解决scheme是询问查询是否实际完成,使用GL_GET_QUERY_AVAILABLE ,如果没有,只是渲染原语(因为,建立起来,渲染对象比等待查询结果要快)。 这将摆脱摊位,牺牲一些不必要的平局。 你可以看一下OpenGL Superbible书中的 清单12.3和12.4 ,这两个方法的组合。